歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> 關於Linux >> 初窺Linux之構建你的Linux“任務管理器”

初窺Linux之構建你的Linux“任務管理器”

日期:2017/3/1 16:04:52   编辑:關於Linux
初窺Linux之構建你的Linux“任務管理器”

在Windows下,大家肯定有用過任務管理器,特別是我們想看看我們的CPU的使用率、內存還剩下多少,又或者某個程序出現了異常還關閉不了時,大家肯定會使用任務管理器來強制結束這個程序。那麼在Linux下有沒有這樣的工具呢?答案是肯定的,作為一個強大的操作系統,Linux怎麼可能沒有“任務管理器”呢?我們可以通過一系列的工具和命令來出色地實現我們在Windows中任務管理中所做的一切工作,構建一個Linux的“任務管理器”。雖然它卻並不像Windows中的任務管理器那樣直觀,然而功能卻非常強大。下面我就用Windows中的任務管理作為對比,介紹這些工具的使用。

一、查看應用程序
在Windows中的任務管理程序中,我們可以很輕松直觀地看到我們打開的應用程序,而在Linux中要如何查看我們(即當前用戶)所打開的應用程序呢?首先介紹一個最簡單的命令——ps,它能將某個時間點的進程運行情況選取下來。我們可以這樣做:

首先,我打開了一個浏覽器程序firefox(中間有一些打開錯誤的信息,讀者可以暫時忽略它),然後利用命令ps -l查看自己的bash打開的程序,從上面可以看到,root這個用戶打開的程序有bash、firefox和ps。為什麼會有ps這個程序?因為你剛輸入ps命令,讓ps這個程序啟動來進行進程的查看,所以當然它也是root打開的一個進程。

下面我就給大家講講輸出中各列的意思吧,因為後面的很多命令都會出現相似的信息。
F:進程的標志,用以說明說明進程的權限,通常為4或1,4表示此進程的權限為root,1表示此進程僅可進行復制(fork) 無法實際執行(exec)。

S:進程的狀態,主要的狀態有R(Running),S(Sleep),D(不可被喚醒的睡眠狀態),T(停止狀態),Z(“僵屍”狀態)。

UID:進程的擁有者(用戶)的ID號,root的ID為0;

PID:此進程的ID號

PPID:此進程的父進程的ID號,可以看到ps和firefox的父進程都是bash,當然了,因為都是由bash這個進程產生的。

C:CPU的使用率,單位為百分比;

PRI:即Priority,代表此進程被CPU所執行的優先級,數值越小代表進程越快被CPU執行。

NI:Nice,也代表進程被CPU所執行的優先級,不同的是PRI是系統指定的,而NI則可由用戶指定,且PRI(new) = PRI(old)+ NI, 簡單點來說,就是PRI不能由用戶決定,但是用戶可通過NI對進程的執行優先級進行調度,對於root其對NI的設置范圍為-20~19,對於普通用戶為0~19(避免一般用戶搶占系統資源)

ADDR/SZ/WCHAN:都與內存有關,ADDR指出進程在內存中的位置,running為“-”,SZ表示用掉多少內存,WCHAN表示進程是否在運行中,“-”同樣表示在運行中。

TTY:終端機位置;TIME:使用掉的CPU時間,注意不是系統時間;CMD:產生此程序的命令。

看到沒?這可是非常詳細的,比你在Windows的任務管理器看到的信息詳細多了。

二、查看進程
在Windows的任務管理器中,我們也可以很輕松的查看到系統到底進行著哪些進程,這些進程對應著哪些用戶,對CPU和內存的使用等情況。在Linux中有什麼好的工具可以實現這個功能呢?這裡跟大家再分享一個工具吧——top。相對於ps是靜態的,只能選取一個時間點的進程狀態,則top就是動態的持續檢測進程的運行情況了。

1、使用ps靜態查看
下面還是先從ps這個工具說起吧,其實ps也能實現這個功能,其方法如下:

注意:是ps aux 沒有“-”。

由於Linux中的所有的進程真的是非常的多,所以在這裡就不一一顯示出來了,每一列的參數的意義跟第一點中的相同,而比第一點中多出的兩列:VSZ表示該進程使用掉的虛擬內存量(KB),RSS表示該進程占用的固定的內存量(KB)。

如果你只看看某個進程的情況那該如何是好呢?非常簡單,例如我想看看firefox這個進程的情況,操作如下:

通過命令管道,把ps輸出的內容進行篩選就可以了,對比第一點的輸出可知,PID為2576的確是firefox的進程ID,真是非常方便和簡單。

2、使用top動態查看
好了,可能你會說Windows的任務管理器中進程的查看可是動態檢測的,不要心急,下面就來介紹一個更加強大好用的工具——top。下面我就介紹一下最簡單的top的用法,top還有很多的功能,大家可以man一下,這裡不一一詳述。操作如下:

top -d 數字,表示每幾秒更新一次,上面的命令表示,每5秒更新檢測一次。

你可以以黑色的粗線為界,把輸出結果分成兩個部分來看,上一部分是系統信息、系統資源的使用情況和進程數等,下一部分跟之前說的一樣,是系統中的進程的情況,其意義與前面所述相同。

這裡就來說說第一部分,黑線以上的內容的意義吧。

第一行:目前時間為10:58:59,開機到目前為止所經過的時間為1:06,已登陸系統用戶數為2,系統在1、5、15分鐘的平均負載,代表的是1、5、15分鐘系統平均要負責運行幾個進程的意思,越小代表系統越閒置,若高於1,就表示系統比較繁忙了。

第二行:顯示進程的總數和個別進程的狀態,總共有135個進程,1個正在運行,134個正在睡眠,0個處於停止狀態,0個全局進程。最後一個是表示“僵屍”進程的個數,若不是0,最好檢查一下,看哪個進程成僵屍了。

第三行:CPU的整體負載

第四行和第五行:表示物理內存和虛擬內存的使用情況。

注:很多時候我們會看到系統沒有運行什麼程序,而內存卻幾乎用光,請不要擔心,內存用光是正常的,因為Linux系統為了加速系統性能,所以會把最近使用到的文件數據緩存下來,這樣將來系統要使用該文件時,就直接由內存中取出而不需要從硬盤中調入內存。反而要注意的是swap(虛擬內存)的使用量,一般來說swap最好不要被使用。

3、查看進程樹或父進程
從之前的例子中我們可以看到,很多進程都有一個父進程,實際上Linux上所有的進程都是init的子進程,那麼我們如何查看一個進程的父進程呢?這點在Windows中的任務管理器中可是做不到的。

1)使用pstree查看,操作如下:

注:A:用ASCII碼來顯示連接,p列出PID,從上面也可以看出,所有的進程都是init的子進程。

2)使用ps查看
沒錯,你還能使用ps這個工具來進行查看,怎麼樣?很強大吧,操作如下:

中間的一些部分省略......


可以看到它列出了之前第一點我們所說的進程的關系,即bash是firefox和ps的父進程。

三、結束任務、結束進程
在Windows上,很多時候我們使用任務管理器來結束某個出現了異常而且不能正常關閉程序或者說結束掉某個進程,這可能也是大多數Windows用戶使用任務管理器的目的。而在Linux下在怎麼辦呢?我們也有很好用的工具,這裡分享兩個常用工具kill和killall。
1)使用kill
其實使用kill和killall都要傳遞一個信號給進程,告訴來告訴這個結束你想要怎麼結束。常用的信息有3個,它們都有一個代號和名稱,使用上代號和名稱是等同的,如下:
1(SIGHUP),啟動被終止的進程,相當於重新啟動。
9(SIGKILL),強制中斷一個進程的執行。
15(SIGTERM),以正常的結束進程來終止該進程,注意,如果該進程已發生問題,就是無法使用正常的方法終止時,輸入這個信號也是沒有用的。

下面我們就來看看kill的使用吧,操作如下:

首先用ps -l來找出所要刪除的進程的ID號,然後使用kill刪除進程,從後面的查看中可以看到firefox已經被終於。而kill的用法為kill -signal PID。由於它後面要加上PID所以經常配合ps、pstree等命令一起使用。

2)使用killall
我知道你想說,kill很麻煩,我想要終止一個進程還要找到它的PID,真的是不太爽啊,有沒有辦法讓我可以根據“執行命令的名稱”來給予信號呢?答案是肯定的,它就是killall。操作如下:

這裡重新運行firefox這個進程,然後使killall來終於這個進程,從最後的輸出結果來看,firefox已經被我們正常終於。怎麼樣?很方便吧!補充一下,killall的用法為:killall -signal 命令名稱。

注:如果大家想在像windows中那樣強制結束進程的話,就把signal改為9或者9所對應的名稱SIGKILL即可,這適用於kill和killall。

四、查看網絡情況
在Windows的任務管理器中,也有一個叫“聯網”的信息頁,雖然大家可以在Windows下不怎麼會關注它(至少我是這樣),但是網絡的使用情況在Linux下是非常重要的,因為Linux通常是作為服務器系統來使用的。然而在Linux下有沒有這樣的工具呢?當然有,它就是netstat,操作如下圖所示:


由於本人對網絡部分還不是很了解,在這裡不作過多的解釋,大家要用到時可以man netstat一下。

五、其他工具
盡管在前面的工具中(如top)也有一些是可以查看系統的各種資源的情況,但是這些工具可能產生較多的你不想要關心的信息,例如,我只想看看CPU和內存的使用情況,我用top的話,就會產生很多我並不關心的進程的信息。所以下面來介紹一些功能專一點的工具。

1、free:查看內存的使用情況
free的使用非常簡單,操作如下:


命令中m表示輸出數據的單位為MB,當然你也可以使用b、k、g等。還可以加一個參數t來顯示物理內存與swap的總量。

2、uptime:查看系統啟動的時間和工作負載,使用非常簡單直接輸入uptime即可,不詳述了。

3、vmstat:檢測系統資源變化
vmstat可以實現CPU/內存/磁盤輸入輸出狀態等。下面以舉幾個例子說明一下這個工具的使用吧。
1)統計目前主機CPU的狀態,每秒1次,共統計2次,操作如下:

下面我來解釋一下一些列的意義吧。
r:等待運行中的進程數量,b:不可被喚醒的進程數量,這兩個選項數學越大,表示系統越繁忙。
si:由磁盤中將程序取出的量,so:由於內存不足而將沒用到的程序寫入到磁盤的swap的容量。
bi:由磁盤寫入的塊數量,bo:寫入到磁盤去的塊數量。這部分數值高,表示系統I/O繁忙。
in:每秒被中斷的進程次數,cs:每秒鐘進行的事件切換次數;
us:非內核層CPU使用狀態;sy內核層使用CPU的狀態,id:閒置的狀態;wa:等待I/O所消耗的CPU狀態;st:被虛擬機所盜用的CPU使用狀態。

2)檢測系統上所有的磁盤的讀寫狀態
操作非常簡單,輸入vmstat -d即可,不一一詳述。

六、總結
看到這裡你已經看到這個Linux“任務管理器”的強大了吧,至少個人感覺比Windows中的任務管理器強大多了。它主要由ps、pstree、top、kill、killall、free、netstat、uptime、vmstat等工具組成。
Copyright © Linux教程網 All Rights Reserved