部分轉自實驗樓。
Linux 為我們提供了一些工具來查看進程的狀態(tài)信息。我們可以通過 top 實時的查看進程的狀態(tài),以及系統的一些信息(如 CPU、內存信息等),我們還可以通過 ps 來靜態(tài)查看當前的進程信息,同時我們還可以使用 pstree 來查看當前活躍進程的樹形結構。
top 工具的使用
top 工具是我們常用的一個查看工具,能實時的查看我們系統的一些關鍵信息的變化:
$ top

top 是一個在前臺執(zhí)行的程序,所以執(zhí)行后便進入到這樣的一個交互界面,正是因為交互界面我們才可以實時的獲取到系統與進程的信息。在交互界面中我們可以通過一些指令來操作和篩選。
我們看到 top 顯示的第一排,
- top 表示當前程序的名稱
- 11:05:18 表示當前的系統的時間
- up 8 days,17:12 表示該機器已經啟動了多長時間
- 1 user 表示當前系統中只有一個用戶
- load average: 0.29,0.20,0.25 分別對應1、5、15分鐘內cpu的平均負載(超過1表示有進程在排隊)
來看 top 的第二行數據,基本上第二行是進程的一個情況統計:
- Tasks: 26 total 進程總數
- 1 running 1個正在運行的進程數
- 25 sleeping 25個睡眠的進程數
- 0 stopped 沒有停止的進程數
- 0 zombie 沒有僵尸進程數
來看 top 的第三行數據,這一行基本上是 CPU 的一個使用情況的統計了:
- Cpu(s): 1.0%us 用戶空間進程占用CPU百分比
- 1.0% sy 內核空間運行占用CPU百分比
- 0.0%ni 用戶進程空間內改變過優(yōu)先級的進程占用CPU百分比
- 97.9%id 空閑CPU百分比
- 0.0%wa 等待輸入輸出的CPU時間百分比
- 0.1%hi 硬中斷(Hardware IRQ)占用CPU的百分比
- 0.0%si 軟中斷(Software IRQ)占用CPU的百分比
- 0.0%st (Steal time) 是 hypervisor 等虛擬服務中,虛擬 CPU 等待實際 >- CPU 的時間的百分比
來看 top 的第四行數據,這一行基本上是內存的一個使用情況的統計了:
- 8176740 total 物理內存總量
- 8032104 used 使用的物理內存總量
- 144636 free 空閑內存總量
- 313088 buffers 用作內核緩存的內存量
- 注意:
系統中可用的物理內存最大值并不是 free 這個單一的值,而是 free + buffers + swap 中的 cached 的和。
來看 top 的第五行數據,這一行基本上是交換區(qū)的一個使用情況的統計了:
- total 交換區(qū)總量
- used 使用的交換區(qū)總量
- free 空閑交換區(qū)總量
- cached 緩沖的交換區(qū)總量,內存中的內容被換出到交換區(qū),而后又被換入到內存,但使用過的交換區(qū)尚未被覆蓋
再下面就是進程的一個情況了:
- PID 進程id
- USER 該進程的所屬用戶
- PR 該進程執(zhí)行的優(yōu)先級 priority 值
- NI 該進程的 nice 值
- VIRT 該進程任務所使用的虛擬內存的總數
- RES 該進程所使用的物理內存數,也稱之為駐留內存數
- SHR 該進程共享內存的大小
- S 該進程進程的狀態(tài): S=sleep R=running Z=zombie
- %CPU 該進程CPU的利用率
- %MEM 該進程內存的利用率
- TIME+ 該進程活躍的總時間
- COMMAND 該進程運行的名字
NICE 值叫做靜態(tài)優(yōu)先級,是用戶空間的一個優(yōu)先級值,其取值范圍是-20至19。這個值越小,表示進程”優(yōu)先級”越高;
PR 值表示 Priority 值叫動態(tài)優(yōu)先級,是進程在內核中實際的優(yōu)先級值,進程優(yōu)先級的取值范圍是通過一個宏定義的,這個宏的名稱是 MAX_PRIO,它的值為 140。Linux 實際上實現了 140 個優(yōu)先級范圍,取值范圍是從 0-139,這個值越小,優(yōu)先級越高。而這其中的 0 - 99 是實時進程的值,而 100 - 139 是給用戶的。
在上文我們曾經說過 top 是一個前臺程序,所以是可以交互的:
- q 退出程序
- I 切換顯示平均負載和啟動時間的信息
- P 根據CPU使用百分比大小進行排序
- M 根據駐留內存大小進行排序
- i 忽略閑置和僵死的進程,這是一個開關式命令
- k 終止一個進程,系統提示輸入 PID 及發(fā)送的信號值。一般終止進程用 15 信號,不能正常結束則使用 9 信號。安全模式下該命令被屏蔽。
ps 工具的使用
ps 工具有許多的參數,下面給大家解釋部分常用的參數:
- 使用 -l 參數可以顯示自己這次登陸的 bash 相關的進程信息羅列出來
ps -l

$ ps aux # 會羅列出所有的進程信息

信息代表的含義:
- F 進程的標志(process flags),當 flags 值為 1 則表示此子程序只是 fork 但沒有執(zhí)行 exec,為 4 表示此程序使用超級管理員 root 權限
- USER 進程的擁有用戶
- PID 進程的 ID
- PPID 其父進程的 PID
- SID session 的 ID
- TPGID 前臺進程組的 ID
- %CPU 進程占用的 CPU 百分比
- %MEM 占用內存的百分比
- NI 進程的 NICE 值
- VSZ 進程使用虛擬內存大小
- RSS 駐留內存中頁的大小
- TTY 終端 ID
- S or STAT 進程狀態(tài)
- WCHAN 正在等待的進程資源
- START 啟動進程的時間
- TIME 進程消耗CPU的時間
- COMMAND 命令的名稱和參數
TPGID欄寫著-1的都是沒有控制終端的進程,也就是守護進程
STAT表示進程的狀態(tài),而進程的狀態(tài)有很多,如下所示
- R Running.運行中
- S Interruptible Sleep.等待調用
- D Uninterruptible Sleep.不可中斷睡眠
- T Stoped.暫?;蛘吒櫊顟B(tài)
- X Dead.即將被撤銷
- Z Zombie.僵尸進程
- W Paging.內存交換
- N 優(yōu)先級低的進程
- < 優(yōu)先級高的進程
- s 進程的領導者
- L 鎖定狀態(tài)
- l 多線程狀態(tài)
- + 前臺進程
其中的 D 是不能被中斷睡眠的狀態(tài),處在這種狀態(tài)的進程不接受外來的任何 signal,所以無法使用 kill 命令殺掉處于D狀態(tài)的進程,無論是 kill,kill -9 還是 kill -15,一般處于這種狀態(tài)可能是進程 I/O 的時候出問題了。
若是查找其中的某個進程的話,我們還可以配合著 grep 和正則表達式一起使用
$ ps aux | grep zsh
此外我們還可以查看時,將連同部分的進程呈樹狀顯示出來
$ ps axjf

可以使用這樣的命令,來自定義我們所需要的參數顯示:
$ ps -afxo user,ppid,pid,pgid,command

pstree 工具的使用
通過 pstree 可以很直接的看到相同的進程數量,最主要的還是我們可以看到所有進程之間的相關性。
$ pstree

$ pstree -up
#參數選擇:
#-A :各程序樹之間以 ASCII 字元來連接;
#-p :同時列出每個 process 的 PID;
#-u :同時列出每個 process 的所屬賬戶名稱。

kill 命令
發(fā)送指定的信號到相應進程。不指定型號將發(fā)送SIGTERM(15)終止指定進程。如果任無法終止該程序可用“-KILL” 參數,其發(fā)送的信號為SIGKILL(9) ,將強制結束進程,使用ps命令或者jobs 命令可以查看進程號。root用戶將影響用戶的進程,非root用戶只能影響自己的進程。
命令格式:
$ kill [參數] [進程號]
實例:
# 殺死進程
$ kill 12345
# 徹底殺死進程
$ kill -9 12345
# 殺死指定用戶所有進程
$ kill -9 $(ps -ef | grep hnlinux) //方法一 過濾出hnlinux用戶進程
$ kill -u hnlinux //方法二