前言
只有光頭才能變強
回顧前面:
這篇主要講解在Linux下程式的管理。
那麼接下來就開始吧,如果文章有錯誤的地方請大家多多包涵,不吝在評論區指正哦~
宣告:基於Centos6.9
一、Linux下的程式
每個使用者均可同時執行多個程式。為了區分每一個執行的程式,Linux給每個程式都做了標識,稱為程式號(process ID),每個程式的程式號是唯一的。
Linux 給每個程式都打上了執行者的標誌,使用者可以控制自己的程式:給自己的程式分配不同的優先順序,也可以隨時終止自己的程式。
- 程式從執行它的使用者處繼承UID、GID,從而決定對檔案系統的存取和訪問。
Linux 不可能在一個 CPU 上同時處理多個任務(作業)請求,而是採用 “分時” 技術來處理這些任務請求。
使用PID區分不同的程式
- 系統啟動後的第一個程式是init,它的PID是1。init是唯一一個由系統核心直接執行的程式。
- 除了init之外,每個程式都有父程式(PPID標識)
- 每個程式還有四個與使用者和組相關的識別號
- 實際使用者識別號 (real user ID,RUID)
- 實際組識別號 (real group ID,RGID)
- 有效使用者識別號 (effect user ID,EUID)
- 有效組識別號 (effect group ID,EGID)
- RUID和RGID的作用:識別正在執行此程式的使用者和組。
- EUID和EGID的作用:確定一個程式對其訪問的檔案的許可權。
程式型別:
- 互動程式
- 由一個Shell啟動的程式。
- 互動程式既可以在前臺執行,也可以在後臺執行。
- 批處理程式
- 不與特定的終端相關聯,提交到等待佇列種順序執行的程式。
- 守護程式(Daemon)
- 在Linux在啟動時初始化,需要時執行於後臺的程式。
程式的啟動方式:
- 手工方式:使用作業系統提供的使用者介面
- 前臺
- 後臺 (&)
- 排程方式:按照預先指定的時間執行
- at
- batch
- cron
前臺程式:
- 指一個程式控制著標準輸入/輸出,在程式執行時,shell 被暫時掛起,直到該程式執行結束後,才退回到 shell。在這個過程中,使用者不能再執行其它程式
後臺程式:
- 使用者不必等待程式執行結束就可以執行其它程式。執行後臺程式的方法是在命令列最後加上 “&”
程式和作業的區別:
- 程式:作業系統的概念,由作業系統負責管理
- 作業:shell程式的概念,由shell程式負責管理
- 一個作業系統可以啟動多個shell程式,shell本身也是一個程式
- 一個作業裡至少包含一個程式,也可以包含多個程式
- 作業分前臺和後臺執行之分
有了上面的知識點,我們就可以畫出這麼一張流程圖:
1.1管理程式常用命令
使用ps
命令檢視程式狀態資訊:
ps -ef
ps aux
ps
命令引數說明:
ps
命令輸出說明:
還有其他幾個常用命令:
- 登出後繼續執行程式:
nohup 命令 [選項] [引數] [輸出檔案] &
- 用過SpringBoot打jar包部署到Linux下的同學對上面這個命令一定不會陌生啦~
- 殺死程式:
kill pid -9
free
:檢視記憶體使用狀況top
:檢視實時重新整理的系統程式資訊- 程式排程的優先權
nice
命令: - 程式執行後調整優先順序:
renice
命令。
作業控制是指控制當前正在執行的程式的行為,也被稱為程式控制。
- 暫時停止某個執行程式 使用
Ctrl+z
- 列舉作業號碼和名稱:
jobs
- 在後臺恢復執行:
bg [%作業號碼]
- 在前臺恢復執行:
fg [%作業號碼]
- 傳送訊號:
kill -[訊號] pid
1.2程式練習題
以root賬戶登入,執行ps命令,選項分別用-a和-af;觀察對比結果,並截圖;執行ps命令,選項為-ef,觀察結果;執行ps,選項為au,觀察結果,並截圖。
切換到jkXX賬戶,用長格式列出/usr/bin/passwd命令,觀察命令的許可權屬性;用後臺方式執行passwd命令;執行ps命令,選項為-ao,引數為user,pid,ruid,euid,tty,cmd,觀察結果並截圖
切換到peter賬戶,用後臺執行命令ls -l /usr/bin | more &,觀察結果;上述命令再次執行兩遍,觀察結果;執行ps命令,選項為au,觀察有哪些程式在執行;執行命令jobs,檢視有哪些作業在執行;通過fg命令把後臺命令轉移到前臺,使之結束,觀察剩餘作業;直到作業全部結束。
切換到jason賬戶,用nice命令啟動在後臺啟動vi編輯軟體,優先順序增加10,用ps命令,選項為-l觀察vi程式的優先順序;用nice命令啟動在後臺啟動vi編輯軟體,優先順序減少10,觀察結果,為什麼不成功;切換到root賬戶,用nice命令啟動在後臺啟動vi編輯軟體,優先順序減少10;
ps命令中顯示TTY代表什麼?
答:tty代表字元終端。
ps命令的輸出結果,哪個程式的狀態為執行狀態?哪個程式為休眠狀態?
答:ps au命令的程式是執行狀態,用R表示;其餘的都是休眠狀態。
passwd命令的euid為多少,它在執行中應獲得誰的許可權?
答:euid為0,它在執行中應獲得檔案所有者root的許可權。
如果用chmod命令把passwd命令的suid屬性去掉,在普通賬戶下執行passwd命令,可以修改密碼嗎?為什麼?
答:不可以,因為passwd命令要修改shadow檔案,shadow檔案是root使用者的,普通賬戶執行passwd命令,沒有獲得root使用者許可權,無法修改shadow檔案。
nice命令減少優先順序的值,需要什麼樣的許可權?
答:需要root使用者許可權
二、守護程式
始終在後臺執行並響應合法請求的程式稱為守護(Daemon)程式。守護程式不是由使用者啟動執行的,也不與終端關聯。
- 一個實際執行中的系統一般會有多個守護程式在執行,且各個系統中執行的守護程式都不盡相同。
- 除非程式異常中止或者人為終止,否則它們將一直執行下去直至系統關閉。
- UNIX/Linux的守護程式在Windows系統中被稱作“服務”。
守護程式的分類:
- 系統守護程式
- 計劃性任務 daemon:如 atd、crond
- 系統日誌 daemon:如 rsyslogd
- 列印假離線 daemon:如 cupsd、lpd
- 網路引數設定 daemon:如 network
- 網路守護程式:
- 各種網路協議偵聽 daemon
- 如:sshd、httpd、postfix、vsftpd
- 網路超級伺服器(Supper Server)
- 如:xinetd 或 inetd
超級伺服器的引入xinetd
:
- 對於系統所要提供的每一種網路服務,都必須執行一個監聽某個埠連線發生的守護程式,這通常意味著系統資源的浪費。
- 為了避免系統資源浪費引入了“超級伺服器”。超級伺服器啟動後同時監聽它所管理的服務的所有埠
- 當有客戶提出服務請求時
- 超級伺服器會判斷這是對哪一個服務的請求,然後再開啟與此服務相應的守護程式
- 由超級伺服器產生的某服務的程式處理客戶的請求,當處理結束便終止此服務程式
- 超級伺服器本身繼續監聽其他服務請求
守護程式的啟動方式:
- 獨立啟動
- 獨立執行的守護程式由init指令碼負責管理,指令碼存放在
/etc/rc.d/init.d/
目錄下 - 所有的系統服務都是獨立執行的。如:crond、syslogd等
- 一些常用的網路守護程式是獨立執行的。如:httpd等
- 獨立執行的守護程式由init指令碼負責管理,指令碼存放在
- 瞬態啟動
- 由網路超級伺服器(xinetd)執行的守護程式,由xinetd管理的守護程式的配置檔案存在
/etc/xinetd.d/
目錄下 - 預設的xinetd的主配置檔案是
/etc/xinetd.conf
- 一些不常用的網路守護程式是由xinetd啟動的,如:telnet、 tftp等
- xinetd本身是獨立執行的守護程式
- 由網路超級伺服器(xinetd)執行的守護程式,由xinetd管理的守護程式的配置檔案存在
2.1管理守護程式常用命令
chkconfig
命令的功能
- 新增指定的新服務
- 清除指定的服務
- 顯示由chkconfig管理的服務
- 改變服務的執行級別
- 檢查服務的啟動狀態
chkconfig --list
會顯示出對應的執行級別:
- 0: 關機
- 1: 單使用者
- 2: 無網路的多使用者
- 3: 命令列模式
- 4: 未用
- 5: GUI(圖形桌面 模式)
- 6 : 重啟
用ntsysv
管理守護程式
使用service
管理守護程式
service --status-all
service server-name status
service server-name start|stop|restart
2.2守護程式練習題
安裝守護程式工具ntsysv,並執行它;通過ntsysv介面,取消crond的自動啟動,通過命令chkconfig來檢查crond自動執行是否被取消;通過chkconfig命令設定crond啟動啟動,通過ntsysv檢查結果;觀察結果,並截圖
編輯xinetd的主配置檔案,修改連結instances = 2,重新啟動xinetd;用putty以telnet方式連線到linux,用pstree命令觀察xinetd啟動的telnet程式數量;繼續開啟telnet連結,直到連線超過限制
編輯系統服務檔案services,修改telnet服務的埠為27,重啟xinetd;用putty以telnet方式連線到linux,顯示當前的網路連結;恢復telnet預設的服務埠,並檢查;觀察結果,並截圖。
telnet服務埠可以改變嗎?如果可以改變,連線telnet服務應注意什麼問題?
答:telnet服務埠可以改變。連線telnet服務的時候,應該注意埠號修改為正在提供telnet服務的埠號。
修改telnet配置檔案,需要xinetd服務重啟嗎?為什麼?
答:需要重新啟動xinetd服務,因為xinetd作為超級伺服器,它負責管理telnet服務的啟動,也要同時檢視telnet的服務配置檔案。當telnet服務配置檔案修改的時候,xinetd服務需要知道配置檔案的變化,重新啟動會重新讀取配置檔案的內容,使之生效。
Telnet為什麼可以看到指令碼程式的執行結果?
答:telnet是一個遠端的字元介面的網路工具,它實現了遠端字元介面的標準輸入和輸出功能;指令碼執行的結果是輸出到標準輸出裝置,也就是字元介面的螢幕,telnet將標準輸出通過網路傳遞到telnet客戶端的螢幕上顯示,因此它可以看到指令碼程式執行的結果。
通過ntsysv命令和chkconfig命令開啟守護程式啟動執行的結果是否完全一樣?有什麼不同?
答:ntntsysv命令關閉守護程式,只是改變了當前使用者執行級別的守護程式開關,具體來說,改變了3號執行級別命令列模式的守護程式開關。chkconfig命令預設改變3、4、5級別的全部開關,chkconfig還可以指定某個執行級別的守護程式開關。
三、安排自動化任務
排程任務的守護程式:
- atd
- crond
安排排程任務的幾個命令:
- at 安排作業在某一時刻執行一次
- batch 安排作業在系統負載不重時執行一次
- cron 安排週期性執行的作業
3.1atd守護程式
atd守護程式負責監控一次性任務的執行,atd守護程式的執行引數/etc/sysconfig/atd
控制普通使用者的使用
- 若
/etc/at.allow
存在,僅列在其中的使用者允許使用 - 若
/etc/at.allow
不存在,檢查/etc/at.deny
,沒有列於其中的所有使用者允許使用 - 若兩個檔案均不存在,僅允許root使用者使用
- 空的
/etc/at.deny
檔案,表示允許所有使用者使用(預設值)
如何使用:
- 安裝命令
yum install at
- atd的啟動
service atd start
- atd服務的檢視
chkconfig --list | grep atd
或者ps -aef | grep atd
at
命令格式及引數at [-q 佇列] [-f 檔名] 時間
3.2cron
- crond守護程式負責監控週期性任務的執行
- crond守護程式的執行引數配置檔案
/etc/sysconfig/crond
控制普通使用者的使用
- 若
/etc/cron.allow
存在,僅列在其中的使用者允許使用 - 若
/etc/cron.allow
不存在,檢查/etc/cron.deny
,沒有列於其中的所有使用者允許使用 - 若兩個檔案均不存在,僅允許root使用者使用
- 空的
/etc/cron.deny
檔案,表示允許所有使用者使用(預設值)
crond啟動以後,每分鐘喚醒一次,檢測如下檔案的變化並將其載入到記憶體
/etc/crontab
:是crontab格式(man 5 crontab)的檔案/etc/cron.d/*
:是crontab格式(man 5 crontab)的檔案/var/spool/cron/*
:是crontab格式(man 5 crontab)的檔案/etc/anacrontab
:是anacrontab格式(man 5 anacrontab)的檔案
3.3安排自動化任務練習
安裝at計劃任務服務,並且啟動它;在下午茶的時間,檢查網路卡資訊;在兩分鐘之後,開啟防火牆;2019年6月1日凌晨兩點,伺服器重啟;明天晚上9點,關閉eth1;用命令檢查正在等待的計劃任務;用at -c檢查正在等待任務的具體內容;刪除其中一條任務,觀察結果。觀察結果,並截圖
編輯一個檔案myatXX(XX為學生的學號末兩位),要求按順序執行如下命令:返回使用者主目錄;檢視使用者賬戶名;檢視當前系統執行的所有程式,並將記錄儲存到檔案ps.log中;新增一個計劃任務,要求下午5點執行檔案中的命令;觀察結果,並截圖
用普通賬戶jsjXX登入,新增一個計劃任務,明天中午關閉eth0;更改at命令的相關配置檔案,禁止jsjXX執行at命令,試驗證之
修改crontab檔案,新增一個新的週期任務,要求如下:每間隔6個小時,把伺服器正在監聽的埠資訊,儲存到/root/net.txt檔案中;每週五或者10,20,30日上午9:00到下午15:00,每個小時第10分鐘,清除目錄/tmp下的所有檔案
新增一個指令碼,要求:每月執行該任務,查詢/home目錄下30天沒有修改的檔案,並刪除它;指令碼名稱為clean-home
登入jsj08 賬務,用crontab -e命令編寫一個週期任務,要求每個2分鐘按順序執行:顯示當前系統時間;顯示賬戶名;顯示當前賬戶的程式資訊;以上命令的結果,全部以追加式方式儲存到使用者主目錄下檔案,檔名為myplanXX(XX為學生的學號末兩位)。用crontab -l檢查編寫的任務
myatXX檔案是否要修改許可權,才能執行?
答:不需要。atd服務只是從myatXX檔案中讀取內容,真正執行的命令會存放在另外一個檔案,我們用at -c命令可以看到這個真正執行檔案內容。
指令碼放在哪個目錄下?指令碼需要新增可執行屬性嗎?
答:指令碼根據不同的週期放到不同的目錄下,本題以月為週期執行,因此放入/etc/cron.monthly目錄下。指令碼需要新增可執行屬性,因為這是真正可執行的指令碼。
普通使用者可以修改at服務的配置檔案嗎?
答:修改at配置檔案需要root許可權,普通使用者不可以修改at的配置檔案。
四、總結
本文主要是總結了Linux下操作程式和自動化任務知識~~~這兩個知識點在Linux下也是很重要的,是學習Linux的基礎~
繼續完善上一次的思維導圖:
如果文章有錯的地方歡迎指正,大家互相交流。習慣在微信看技術文章,想要獲取更多的Java資源的同學,可以關注微信公眾號:Java3y。為了大家方便,剛新建了一下qq群:742919422,大家也可以去交流交流。謝謝支援了!希望能多介紹給其他有需要的朋友
文章的目錄導航: