天天看點

程序和計劃任務管理|linux檢視程序4.pstree——檢視程序樹程序的啟動方式計劃任務管理

前言:程式是儲存在外部存儲媒體(如硬碟、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”指令。

程式和計劃任務管理|linux檢視程式4.pstree——檢視程式樹程式的啟動方式計劃任務管理

上述輸出資訊中,第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:核心名稱。

程式和計劃任務管理|linux檢視程式4.pstree——檢視程式樹程式的啟動方式計劃任務管理

由于系統中運作的程序數量較多,需要查詢某一個程序的資訊時可以結合管道操作和grep指令進行過濾。例如,過濾包含“bash”的程序資訊。

程式和計劃任務管理|linux檢視程式4.pstree——檢視程式樹程式的啟動方式計劃任務管理

2.top——檢視程序動态資訊

top指令可以實時動态地檢視系統的整體運作情況,是一個綜合了多方資訊監測系統性能和運作資訊的實用工具。通過top指令所提供的互動式界面,用熱鍵可以管理。

可跟選項:

-b:以批處理模式操作;

-c:顯示完整的治指令;

-d:螢幕重新整理間隔時間;

-I:忽略失效過程;

-s:保密模式;

-S:累積模式;

-i<時間>:設定間隔時間;

-u<使用者名>:指定使用者名;

-p<程序号>:指定程序;

-n<次數>:循環顯示的次數。

程式和計劃任務管理|linux檢視程式4.pstree——檢視程式樹程式的啟動方式計劃任務管理

上述輸出資訊中,開頭的部分顯示了系統(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号:

程式和計劃任務管理|linux檢視程式4.pstree——檢視程式樹程式的啟動方式計劃任務管理

例如,查詢使用者root在tty1終端上運作的程序及PID号:

程式和計劃任務管理|linux檢視程式4.pstree——檢視程式樹程式的啟動方式計劃任務管理

4.pstree——檢視程序樹

pstree指令以樹狀圖的方式展現程序之間的派生關系,顯示效果比較直覺。

可跟選項:

-a:顯示每個程式的完整指令,包含路徑,參數或是常駐服務的标示;

-c:不使用精簡标示法;

-G:使用VT100終端機的列繪圖字元;

-h:列出樹狀圖時,特别标明現在執行的程式;

-H<程式識别碼>:此參數的效果和指定"-h"參數類似,但特别标明指定的程式;

-l:采用長列格式顯示樹狀圖;

-n:用程式識别碼排序。預設是以程式名稱來排序;

-p:顯示程式識别碼;

-u:顯示使用者名稱;

-U:使用UTF-8列繪圖字元;

-V:顯示版本資訊。

例如,檢視目前系統的程序樹,包括各程序對應的PID号、使用者名、完整指令等資訊。

程式和計劃任務管理|linux檢視程式4.pstree——檢視程式樹程式的啟動方式計劃任務管理

。。。。。//省略部分資訊。

程序的啟動方式

手工啟動

前台啟動:使用者輸入指令,直接執行程式
背景啟動:在指令行尾加入“&”符号
程式和計劃任務管理|linux檢視程式4.pstree——檢視程式樹程式的啟動方式計劃任務管理

排程啟動

使用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啟動的程序。

程式和計劃任務管理|linux檢視程式4.pstree——檢視程式樹程式的啟動方式計劃任務管理
程式和計劃任務管理|linux檢視程式4.pstree——檢視程式樹程式的啟動方式計劃任務管理
程式和計劃任務管理|linux檢視程式4.pstree——檢視程式樹程式的啟動方式計劃任務管理

計劃任務管理

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”檔案中。

程式和計劃任務管理|linux檢視程式4.pstree——檢視程式樹程式的啟動方式計劃任務管理

以下操作将設定一條計劃任務,在當天的21:30時自動關閉目前系統。對于已經設定但還未執行(未到時間點)的計劃任務,可以通過atq指令進行查詢。但已執行過的at任務将不會再出現在清單中。

程式和計劃任務管理|linux檢視程式4.pstree——檢視程式樹程式的啟動方式計劃任務管理

若要删除指定編号的at任務,可以使用atrm指令。删除後的at任務将不會被執行,并且不會顯示在atq指令的顯示結果中。但已經執行過的任務無法删除。

例如,删除第二條at計劃任務。

程式和計劃任務管理|linux檢視程式4.pstree——檢視程式樹程式的啟動方式計劃任務管理

crontab周期性任務設定

crontab指令被用來送出和管理使用者的需要周期性執行的任務,與windows下的計劃任務類似,當安裝完成作業系統後,預設會安裝此服務工具,并且會自動啟動crond程序,crond程序每分鐘會定期檢查是否有要執行的任務,如果有要執行的任務,則自動執行該任務。

crontab指令:

按照預先設定的時間周期(分鐘、小時、天,月,星期)重複執行使用者指定的指令操作

屬于周期性計劃任務

主要檔案設定:

全局配置檔案,位于檔案: /etc/crontab

系統預設的設定,位于目錄 /etc/cron.*/

使用者定義的設定,位于檔案: /var/spllo/cron/使用者名

程式和計劃任務管理|linux檢視程式4.pstree——檢視程式樹程式的啟動方式計劃任務管理
使用crontab指令管理使用者的計劃任務

設定使用者的周期性計劃任務清單主要通過crontab指令進行,結合不同的選項可以完成不同的計劃任務管理操作。常用的選項如下。

-e:編輯計劃任務清單。

-u:指定所管理的計劃任務屬于哪個使用者,預設時針對目前使用者(自己),一般隻有root使用者有權限使用此選項(用于編輯、删除其他使用者的計劃任務)。

-l:清單顯示計劃任務。

-r:删除計劃任務清單。

下面将分别講解crontab指令相關選項的使用。

(1)編輯使用者的計劃任務清單

執行“crontab -e”指令後,将打開計劃任務編輯界面(與vi中的操作相同)。通過該界面使用者可以自行添加具體的任務配置,每行代表一個紀錄,配置的格式與/etc/crontab檔案中的主體部分類似,

程式和計劃任務管理|linux檢視程式4.pstree——檢視程式樹程式的啟動方式計劃任務管理

每一行任務配置任務,都包括六個資料字段,分别表示不同的含義,每個字段必須定義。

程式和計劃任務管理|linux檢視程式4.pstree——檢視程式樹程式的啟動方式計劃任務管理

由于各字段的作用不同,其取值範圍也不一樣,當使用“”時表示取值範圍中的任意時間。crontab任務配置紀錄中所設定的指令操作将在“分鐘”+“小時”+“日期”+“月份”+“星期”都滿足的條件下執行。

程式和計劃任務管理|linux檢視程式4.pstree——檢視程式樹程式的啟動方式計劃任務管理

除了 “*”以外,還可以使用減号“-”、逗号“,”、斜杠“/”與數字構成表達式來表示較複雜的時間關系。

減号“-”:可以表示一個連續的時間範圍,如“1-4”表示整數1、2、3、4。

逗号“,”:可以表示一個間隔的不連續範圍,如“3,4,6,8”。

斜杠符号“/”:可以用來指定間隔頻率,如在日期字段中的“/3”表示每隔3天。

例如,給使用者csdn設定一條計劃任務:在每周日的13.14分将/etc/passwd 檔案的内容複制到宿主目錄中,儲存為csdn.txt。

程式和計劃任務管理|linux檢視程式4.pstree——檢視程式樹程式的啟動方式計劃任務管理

當隻需要删除某一條計劃任務時,可以通過“crontab -e”進行編輯;而若要清空某個使用者的所有計劃任務,可以執行“crongtab -r”指令。

程式和計劃任務管理|linux檢視程式4.pstree——檢視程式樹程式的啟動方式計劃任務管理
程式和計劃任務管理|linux檢視程式4.pstree——檢視程式樹程式的啟動方式計劃任務管理
定時任務注意事項

定時任務(一般是腳本任務)規則的結尾最好加上“>/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中的配置資訊。

程式和計劃任務管理|linux檢視程式4.pstree——檢視程式樹程式的啟動方式計劃任務管理
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 目錄中所有的可執行檔案。

程式和計劃任務管理|linux檢視程式4.pstree——檢視程式樹程式的啟動方式計劃任務管理

總結:通過學習程序和計劃任務管理,讓我們學會檢視和控制程序以及掌握crontab計劃任務管理。

繼續閱讀