前言:程式是儲存在外部存儲媒體(如硬碟、CD光牒)中的可執行機器代碼和資料的靜态集合,而程序是在CPU及記憶體中處于動态執行狀态的計算機程式。在linux系統中,每個程式啟動後可以建立一個或多個程序。例如,提供Web服務的httpd程式,當有大量使用者同時通路Web頁面時,httpd程式可能會建立多個程序來提供服務。
檢視程序
了解系統中程序的狀态是對程序進行管理的前提,使用不同的指令工具可以從不同的角度檢視程序狀态
1.ps——檢視靜态的程序統計資訊(processes statistic)
ps指令用于報告目前系統的程序狀态。可以搭配kill指令随時中斷、删除不必要的程式。ps指令是最基本同時也是非常強大的程序檢視指令,使用該指令可以确定有哪些程序正在運作和運作的狀态、程序是否結束、程序有沒有僵死、哪些程序占用了過多的資源等等,總之大部分資訊都是可以通過執行該指令得到的。
通過不同的指令選項,可以有選擇性地檢視程序資訊。
-a:顯示所有終端機下執行的程式,除了階段作業上司者之外。
a:顯示現行終端機下的所有程式,包括其他使用者的程式。
-A:顯示所有程式。
-c:顯示CLS和PRI欄位。
c:列出程式時,顯示每個程式真正的指令名稱,而不包含路徑,選項或常駐服務的标示。
-C<指令名稱>:指定執行指令的名稱,并列出該指令的程式的狀況。
-d:顯示所有程式,但不包括階段作業上司者的程式。
-e:此選項的效果和指定"A"選項相同。
e:列出程式時,顯示每個程式所使用的環境變量。
-f:顯示UID,PPIP,C與STIME欄位。
f:用ASCII字元顯示樹狀結構,表達程式間的互相關系。
-g<群組名稱>:此選項的效果和指定"-G"選項相同,當亦能使用階段作業上司者的名稱來指定。
g:顯示現行終端機下的所有程式,包括群組上司者的程式。
-G<群組識别碼>:列出屬于該群組的程式的狀況,也可使用群組名稱來指定。
h:不顯示标題列。
-H:顯示樹狀結構,表示程式間的互相關系。
-j或j:采用工作控制的格式顯示程式狀況。
-l或l:采用詳細的格式來顯示程式狀況。
L:列出欄位的相關資訊。
-m或m:顯示所有的執行緒。
n:以數字來表示USER和WCHAN欄位。
-N:顯示所有的程式,除了執行ps指令終端機下的程式之外。
-p<程式識别碼>:指定程式識别碼,并列出該程式的狀況。
p<程式識别碼>:此選項的效果和指定"-p"選項相同,隻在清單格式方面稍有差異。
r:隻列出現行終端機正在執行中的程式。
-s<階段作業>:指定階段作業的程式識别碼,并列出隸屬該階段作業的程式的狀況。
s:采用程式信号的格式顯示程式狀況。
S:列出程式時,包括已中斷的子程式資料。
-t<終端機編号>:指定終端機編号,并列出屬于該終端機的程式的狀況。
t<終端機編号>:此選項的效果和指定"-t"選項相同,隻在清單格式方面稍有差異。
-T:顯示現行終端機下的所有程式。
-u<使用者識别碼>:此選項的效果和指定"-U"選項相同。
u:以使用者為主的格式來顯示程式狀況。
-U<使用者識别碼>:列出屬于該使用者的程式的狀況,也可使用使用者名稱來指定。
U<使用者名稱>:列出屬于該使用者的程式的狀況。
v:采用虛拟記憶體的格式顯示程式狀況。
-V或V:顯示版本資訊。
-w或w:采用寬闊的格式來顯示程式狀況。
x:顯示所有程式,不以終端機來區分。
X:采用舊式的Linux i386登陸格式顯示程式狀況。
-y:配合選項"-l"使用時,不顯示F(flag)欄位,并以RSS欄位取代ADDR欄位 。
-<程式識别碼>:此選項的效果和指定"p"選項相同。
–cols<每列字元數>:設定每列的最大字元數。
–columns<每列字元數>:此選項的效果和指定"–cols"選項相同。
–cumulative:此選項的效果和指定"S"選項相同。
–deselect:此選項的效果和指定"-N"選項相同。
–forest:此選項的效果和指定"f"選項相同。
–headers:重複顯示标題列。
–help:線上幫助。
–info:顯示排錯資訊。
–lines<顯示列數>:設定顯示畫面的列數。
–no-headers:此選項的效果和指定"h"選項相同,隻在清單格式方面稍有差異。
–group<群組名稱>:此選項的效果和指定"-G"選項相同。
–Group<群組識别碼>:此選項的效果和指定"-G"選項相同。
–pid<程式識别碼>:此選項的效果和指定"-p"選項相同。
–rows<顯示列數>:此選項的效果和指定"–lines"選項相同。
–sid<階段作業>:此選項的效果和指定"-s"選項相同。
–tty<終端機編号>:此選項的效果和指定"-t"選項相同。
–user<使用者名稱>:此選項的效果和指定"-U"選項相同。
–User<使用者識别碼>:此選項的效果和指定"-U"選項相同。
–version:此選項的效果和指定"-V"選項相同。
–widty<每列字元數>:此選項的效果和指定"-cols"選項相同。
以上列出的是ps指令中的選項,需要注意的是,有一部分選項是不帶“-”字首的。習慣上将上述選項組合在一起使用,如執行“ps aux”或“ps -elf”指令。
上述輸出資訊中,第1行為清單标題,其中各字段的含義描述如下:
USER 程序的屬主;
PID 程序的ID;
%CPU 程序占用的CPU百分比;
%MEM 占用記憶體的百分比;
VSZ 程序使用的虛拟內存量(KB);
RSS 該程序占用的固定內存量(KB)(駐留中頁的數量);
TTY 該程序在那個終端上運行(登陸者的終端位置),若與終端無關,則表示(?)。
若為pts/0等,則表示由網絡連接配接主機程序
START 該程序被觸發啟動時間;
TIME 該程序實際使用CPU運作的時間;
COMMAND 指令的名稱和參數;
STAT狀态位常見的狀态字元
D 無法中斷的休眠狀态(通常 IO 的程序);
R 正在運作可中在隊列中可過行的;
S 處于休眠狀态;
T 停止或被追蹤;
W 進入記憶體交換 (從核心2.6開始無效);
X 死掉的程序 (基本很少見);
Z 僵屍程序;
< 優先級高的程序
N 優先級較低的程序
L 有些頁被鎖進記憶體;
s 程序的上司者(在它之下有子程序);
ps -elf指令與ps -aux指令大緻相同,
其他代表的含義:
PPID:父程序。
NI:核心态(NICE值,為-20~19,值越小,占用資源優先級值越高)。
ADDR:為“-”是代表正在運作。
SZ:占用swap交換分區的值。
WCHHN:核心名稱。
由于系統中運作的程序數量較多,需要查詢某一個程序的資訊時可以結合管道操作和grep指令進行過濾。例如,過濾包含“bash”的程序資訊。
2.top——檢視程序動态資訊
top指令可以實時動态地檢視系統的整體運作情況,是一個綜合了多方資訊監測系統性能和運作資訊的實用工具。通過top指令所提供的互動式界面,用熱鍵可以管理。
可跟選項:
-b:以批處理模式操作;
-c:顯示完整的治指令;
-d:螢幕重新整理間隔時間;
-I:忽略失效過程;
-s:保密模式;
-S:累積模式;
-i<時間>:設定間隔時間;
-u<使用者名>:指定使用者名;
-p<程序号>:指定程序;
-n<次數>:循環顯示的次數。
上述輸出資訊中,開頭的部分顯示了系統(Tasks)、CPU占用、記憶體占用(Mem)、交換空間(Swap)等彙總資訊;彙總資訊下方依次顯示目前程序的排名情況。相關資訊的含義表述如下:
系統任務(Task)資訊:total,總程序數;running,正在運作的程序數;sleeping,休眠的程序數;stopped,中止的程序數;zombie,僵死無響應的程序數。
cpu占用資訊:us,使用者占用;sy,核心占用;ni,優先級排程占用;id,空閑CPU;wa,I/O等待占用;hi,硬體中斷占用;si,軟體中斷占用;st,虛拟化占用。要了解空閑的CPU百分比,主要是看%id部分。
記憶體占用(Mem)資訊:total,總記憶體空間;used,已用記憶體;free,空閑記憶體;buffers,緩沖區域。
交換空間(Swap)占用:total,總交換空間;used,已用記憶體;free,空閑記憶體;buffers,緩沖區域。
3.pgrep——查詢程序資訊
pgrep指令以名稱為依據從運作程序隊列中查找程序,并顯示查找到的程序id。每一個程序ID以一個十進制數表示,通過一個分割字元串和下一個ID分開,預設的分割字元串是一個新行。對于每個屬性選項,使用者可以在指令行上指定一個以逗号分割的可能值的集合。
可跟選項:
-o:僅顯示找到的最小(起始)程序号;
-n:僅顯示找到的最大(結束)程序号;
-l:顯示程序名稱;
-P:指定父程序号;
-g:指定程序組;
-t:指定開啟程序的終端;
-u:指定程序的有效使用者ID。
例如,查詢程序名中包含“log”的程序及其PID号:
例如,查詢使用者root在tty1終端上運作的程序及PID号:
4.pstree——檢視程序樹
pstree指令以樹狀圖的方式展現程序之間的派生關系,顯示效果比較直覺。
可跟選項:
-a:顯示每個程式的完整指令,包含路徑,參數或是常駐服務的标示;
-c:不使用精簡标示法;
-G:使用VT100終端機的列繪圖字元;
-h:列出樹狀圖時,特别标明現在執行的程式;
-H<程式識别碼>:此參數的效果和指定"-h"參數類似,但特别标明指定的程式;
-l:采用長列格式顯示樹狀圖;
-n:用程式識别碼排序。預設是以程式名稱來排序;
-p:顯示程式識别碼;
-u:顯示使用者名稱;
-U:使用UTF-8列繪圖字元;
-V:顯示版本資訊。
例如,檢視目前系統的程序樹,包括各程序對應的PID号、使用者名、完整指令等資訊。
。。。。。//省略部分資訊。
程序的啟動方式
手工啟動
前台啟動:使用者輸入指令,直接執行程式
背景啟動:在指令行尾加入“&”符号
排程啟動
使用at指令,設定一次性計劃任務
使用crontab指令,設定周期性計劃任務
程序的前背景排程
ctrl+Z組合鍵:将目前程序挂起,即調入背景并停止執行
jobs指令:檢視處于背景的任務清單
fg指令:将背景程序恢複到前台運作,可指定任務序号
ctrl+c 組合鍵:中斷正在執行的指令
kill、killall——終止程序
kill指令用來删除執行中的程式或工作。kill可将指定的資訊送至程式。預設的資訊為SIGTERM(15),可将指定程式終止。若仍無法終止該程式,可使用SIGKILL(9)資訊嘗試強制删除程式。程式或工作的編号可利用ps指令或job指令檢視。
killall指令使用程序的名稱來殺死程序,使用此指令可以殺死一組同名程序。我們可以使用kill指令殺死指定程序PID的程序,如果要找到我們需要殺死的程序,我們還需要在之前使用ps等指令再配合grep來查找程序,而killall把這兩個過程合二為一,是一個很好用的指令。
-9選項用于強制終止
pkill——終止程序
根據特定條件終止相應的程序
常用指令選項:
-U:根據程序所屬的使用者名終止相應程序
-t:根據程序所在的終端終止相應程序
例如,建立csdn使用者後,終止由使用者csdn啟動的程序。
計劃任務管理
at——一次性計劃任務
at指令用于在指定時間執行指令。at允許使用一套相當複雜的指定時間的方法。它能夠接受在當天的hh:mm(小時:分鐘)式的時間指定。假如該時間已過去,那麼就放在第二天執行。當然也能夠使用midnight(深夜),noon(中午),teatime(飲茶時間,一般是下午4點)等比較模糊的 詞語來指定時間。使用者還能夠采用12小時計時制,即在時間後面加上AM(上午)或PM(下午)來說明是上午還是下午。 也能夠指定指令執行的具體日期,指定格式為month day(月 日)或mm/dd/yy(月/日/年)或dd.mm.yy(日.月.年)。指定的日期必須跟在指定時間的後面。
上面介紹的都是絕對計時法,其實還能夠使用相對計時法,這對于安排不久就要執行的指令是很有好處的。指定格式為:now + count time-units,now就是目前時間,time-units是時間機關,這裡能夠是minutes(分鐘)、hours(小時)、days(天)、weeks(星期)。count是時間的數量,究竟是幾天,還是幾小時,等等。 更有一種計時方法就是直接使用today(今天)、tomorrow(明天)來指定完成指令的時間。
設定一次性計劃任務的三部曲:1.設定時間,2.輸入指令,3.按ctrl+c組合鍵送出任務。
例如,以下操作先通過date指令确認目前的系統時間,并設定在2019年11月14日的5:20分自動執行以下任務:統計該時間點系統中由root使用者運作的程序的數量,并将該數值儲存到“ /tmp/ps.root”檔案中。
以下操作将設定一條計劃任務,在當天的21:30時自動關閉目前系統。對于已經設定但還未執行(未到時間點)的計劃任務,可以通過atq指令進行查詢。但已執行過的at任務将不會再出現在清單中。
若要删除指定編号的at任務,可以使用atrm指令。删除後的at任務将不會被執行,并且不會顯示在atq指令的顯示結果中。但已經執行過的任務無法删除。
例如,删除第二條at計劃任務。
crontab周期性任務設定
crontab指令被用來送出和管理使用者的需要周期性執行的任務,與windows下的計劃任務類似,當安裝完成作業系統後,預設會安裝此服務工具,并且會自動啟動crond程序,crond程序每分鐘會定期檢查是否有要執行的任務,如果有要執行的任務,則自動執行該任務。
crontab指令:
按照預先設定的時間周期(分鐘、小時、天,月,星期)重複執行使用者指定的指令操作
屬于周期性計劃任務
主要檔案設定:
全局配置檔案,位于檔案: /etc/crontab
系統預設的設定,位于目錄 /etc/cron.*/
使用者定義的設定,位于檔案: /var/spllo/cron/使用者名
使用crontab指令管理使用者的計劃任務
設定使用者的周期性計劃任務清單主要通過crontab指令進行,結合不同的選項可以完成不同的計劃任務管理操作。常用的選項如下。
-e:編輯計劃任務清單。
-u:指定所管理的計劃任務屬于哪個使用者,預設時針對目前使用者(自己),一般隻有root使用者有權限使用此選項(用于編輯、删除其他使用者的計劃任務)。
-l:清單顯示計劃任務。
-r:删除計劃任務清單。
下面将分别講解crontab指令相關選項的使用。
(1)編輯使用者的計劃任務清單
執行“crontab -e”指令後,将打開計劃任務編輯界面(與vi中的操作相同)。通過該界面使用者可以自行添加具體的任務配置,每行代表一個紀錄,配置的格式與/etc/crontab檔案中的主體部分類似,
每一行任務配置任務,都包括六個資料字段,分别表示不同的含義,每個字段必須定義。
由于各字段的作用不同,其取值範圍也不一樣,當使用“”時表示取值範圍中的任意時間。crontab任務配置紀錄中所設定的指令操作将在“分鐘”+“小時”+“日期”+“月份”+“星期”都滿足的條件下執行。
除了 “*”以外,還可以使用減号“-”、逗号“,”、斜杠“/”與數字構成表達式來表示較複雜的時間關系。
減号“-”:可以表示一個連續的時間範圍,如“1-4”表示整數1、2、3、4。
逗号“,”:可以表示一個間隔的不連續範圍,如“3,4,6,8”。
斜杠符号“/”:可以用來指定間隔頻率,如在日期字段中的“/3”表示每隔3天。
例如,給使用者csdn設定一條計劃任務:在每周日的13.14分将/etc/passwd 檔案的内容複制到宿主目錄中,儲存為csdn.txt。
當隻需要删除某一條計劃任務時,可以通過“crontab -e”進行編輯;而若要清空某個使用者的所有計劃任務,可以執行“crongtab -r”指令。
定時任務注意事項
定時任務(一般是腳本任務)規則的結尾最好加上“>/dev/null 2>&1”等内容,其中,“>”表示重定向,“dev/null”為特殊的字元裝置檔案,表示黑洞裝置或空裝置。“2>&1”表示讓标準錯誤輸出和标準輸出一樣,本指令内容即把腳本的正常和錯誤輸出都重定向到/dev/null,即不紀錄任何輸出。
如果定時任務規則結尾不加“>/dev/null 2>&1”等指令配置,有可能有大量輸出資訊,時間長了,會産生大量檔案占用大量磁盤inode節點(每個檔案占用一個inode),以至于磁盤inode滿而無法寫入正常資料。
run.parts工具
軟體包crontabs除了提供系統預設設定的計劃任務的目錄外,還提供名為run.parts的工具,該工具可以執行指定目錄中的所有可執行檔案,是以系統會使用run.parts工具調用執行位于 /etc/cron.*/中的腳本檔案。例如,預設配置檔案/etc/cron.d/0hourly中的配置資訊。
anacron程式
anacron 是用來做什麼的呢?設想這樣一個場景,Linux 伺服器會在周末關機兩天,但是設定的定時任務大多在周日早上進行,但在這個時間點,伺服器又處于關機狀态,導緻系統很多定時任務無法運作。
又比如,我們需要在淩晨 5 點 05 分執行系統的日志備份,但 Linux 伺服器不是 24 小時開機的,在晚上需要關機,白天上班之後才會再次開機,在這個定時任務的執行時間我們的伺服器剛好沒有開機,那麼這個定時任務就不會執行了。anacron 就是用來解決這個問題的。
anacron 會以 1 天、1周(7天)、一個月作為檢測周期,判斷是否有定時任務在關機之後沒有執行。如果有這樣的任務,那麼 anacron 會在特定的時間重新執行這些定時任務。
那麼,anacron 是如何判斷這些定時任務已經超過執行時間的呢?這就需要借助 anacron 讀取的時間記錄檔案。anacron 會分析現在的時間與時間記錄檔案所記載的上次執行 anacron 的時間,将兩者進行比較,如果兩個時間的內插補點超過 anacron 的指定時間內插補點(一般是 1 天、7 天和一個月),就說明有定時任務沒有執行,這時 anacron 會介入并執行這個漏掉的定時任務,進而保證在關機時沒有執行的定時任務不會被漏掉。
我們用 cron.daily 工作來說明一下 /etc/anacrontab 的執行過程:
1.讀取 /var/spool/anacron/cron.daily 檔案中 anacron 上一次執行的時間。
2.和目前時間比較,如果兩個時間的內插補點超過 1 天,就執行 cron.daily 工作。
3.隻能在 03:00-22:00 執行這個工作。
4.執行工作時強制延遲時間為 5 分鐘,再随機延遲 0~45 分鐘。
5.使用 nice 指令指定預設優先級,使用 run-parts 腳本執行 /etc/cron.daily 目錄中所有的可執行檔案。
總結:通過學習程序和計劃任務管理,讓我們學會檢視和控制程序以及掌握crontab計劃任務管理。