一、ps命令介紹
Linux系統中會運行各種各樣的進程,如果要對進程進行監控,首先必須了解當前進程的情況,也就是需要查看當前進程。ps命令就是最基本的進程查看命令,使用該命令可以看到有哪些進程正在運行,並且可以看到進程的運行狀態、進程是否結束、進程有沒有僵死、哪些進程占用了過多的資源等等。總之大部分信息都是可以通過執行該命令得到。ps是顯示瞬間進程的狀態,並不動態連續,如果想對進程進行實時監控應該用top命令。ps命令的格式為:
ps [選項]
ps命令常用的選項參數有:
| 選項 | 功能 |
| -A | 顯示所有的進程,跟-e的效果相同 |
| -a | 顯示現行終端機下的所有進程,包括其他用戶的進程 |
| -u | 顯示當前用戶的進程狀態 |
| -x | 通常與 a 這個參數一起使用,可列出較完整信息 |
| -l | 較長、較詳細的將該PID的信息列出 |
| -j | 工作的格式(jobs format) |
| -f | 把進程的所有信息都顯示出來 |
| -e | 表示顯示所有繼承 |
由於ps命令支持的系統類型相當的多,所以它的參數多的離譜,而且有沒有加上 - 差很多,所以只需要記住常用的幾個命令即可。
二、ps使用實例
【例1】較長、較詳細的將屬於本次登入用戶的進程列出來
➜ ~ ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 0 S 1001 1702969 1702967 0 80 0 - 11484 - pts/1 00:00:01 zsh 0 R 1001 1710433 1702969 0 80 0 - 7460 - pts/1 00:00:00 ps
各個表頭的含義為:
- F:代表這個進程的flag,如果是4,則代表使用者為 super user
- S:代表這個進程的狀態stat
- UID:代表執行者的userId
- PID:進程的id
- PPID:父進程的id
- C:占用CPU資源的百分比
- PRI:指進程的執行優先級(Priority的簡寫),其值越小越早被執行
- NI:代表進程的nice值,其表示進程可被執行的優先級的修正數值
- ADDR:代表進程的地址,它指出該進程在內存的哪個部分,如果是個正在運行的程序,一般都是"-"
- SZ:占用的內存大小
- WCHAN:判斷當前進程是否正在運行,若為"-",則代表正在運行;若該進程處於休眠狀態,該值就是它在內核中的地址
- TTY:該進程是在那個終端機上面運行,若與終端機無關,則顯示?,另外,tty1-tty6 是本機上面的登入者程序,若為 pts/0 等等的,則表示為由網絡連接進主機的程序。
- TIME:占用CPU的時間
- CMD:所下達的指令名稱
【例2】列出當前內存中的所有進程
➜ ~ ps -aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 204676 7012 ? Ss Jul07 6:37 /sbin/init nokaslr root 2 0.0 0.0 0 0 ? S Jul07 0:07 [kthreadd] root 4 0.0 0.0 0 0 ? I< Jul07 0:00 [kworker/0:0H] root 6 0.0 0.0 0 0 ? I< Jul07 0:00 [mm_percpu_wq] root 7 0.0 0.0 0 0 ? S Jul07 7:03 [ksoftirqd/0] root 8 0.0 0.0 0 0 ? I Jul07 54:18 [rcu_sched] root 9 0.0 0.0 0 0 ? I Jul07 0:00 [rcu_bh] ...... ......
各個表頭的含義為:
- USER:表示該進程屬於哪個用戶
- PID:進程id
- %CPU:該進程占用CPU資源的百分比
- %MEM:該進程占用內存的百分比
- VSZ:該進程使用掉的虛擬內存量 (Kbytes)
- RSS:該進程占用的固定的內存量 (Kbytes)
- TTY:該進程是在那個終端機上面運行,若與終端機無關,則顯示?,另外,tty1-tty6 是本機上面的登入者程序,若為 pts/0 等等的,則表示為由網絡連接進主機的程序。
- STAT:代表該進程目前的狀態,主要的狀態有:
- R:該進程正在運行
- S:該進程正在休眠,但可被某些信號(signal)喚醒
- D:無法中斷的休眠狀態(通常為IO進程)
- T:該進程已經停止
- Z:僵死狀態,該進程應該已經終止,但是其父進程卻無法正常的終止它,造成zombie(疆屍)程序的狀態
- W:等待狀態,等待內存的分配
- <:高優先級的進程
- N:低優先級的進程
- START:該進程被觸發啟動的時間
- COMMAND:該進程的實際指令
ps -aux默認是無序的,可以通過--sort命令來排序,如:按照cpu占用來降序排序:
➜ test ps -aux --sort -pcpu|less -N #按照cpu占用來排序
➜ test ps -aux --sort -pmem|less -N #按照內存占用來排序


【例3】查看指定進程,如查看php進程:
# ps -ef | grep php root 794 1 0 2020 ? 00:00:52 php-fpm: master process (/etc/php/7.3/fpm/php-fpm.conf) www-data 951 794 0 2020 ? 00:24:15 php-fpm: pool www www-data 953 794 0 2020 ? 00:24:14 php-fpm: pool www www-data 954 794 0 2020 ? 00:24:29 php-fpm: pool www ...
三、使用ps命令實時查看進程
ps 命令會顯示你系統當前的進程狀態,但是這個結果是靜態的。如果我們想要使用ps命令來實時查看進程狀態,並且通過CPU和內存用量來對結果進行排序,並且希望結果能夠每秒刷新1次,我們可以把ps命令和watch命令結合起來使用。
watch -n 1 'ps -aux --sort -pcpu,+pmem | head -6'
執行上述命令之后,結果如下圖,這個結果會每秒刷新1次。解釋一下這個命令:ps -aux會顯示所有的進程,--sort -pcpu,+pmem 會使用CPU、內存來排序,head -6會顯示前6行數據,即只看前5個進程情況,通過watch命令來做到每秒更新。

四、殺死進程的方式:kill、kill -9、killall
我們都知道殺死一個進程,可以使用kill命令,而kill和kill -9都可以殺死進程,那么它們到底有什么區別呢?它們的區別如下:
執行kill命令,系統會發送一個SIGTERM信號給對應的程序。當程序接收到該signal信號后,有以下幾種情況:
①程序立即停止
②等程序釋放相應的資源后再停止
③程序可能仍然繼續運行
大部分程序接收到SIGTERM信號后,會先釋放自己的資源,然后再停止。但是也有程序可能接收信號后,做一些其他的事情(如正在等待IO的進程),也就是說,SIGTERM多半是會被阻塞的。
而kill -9命令,系統給對應進程發送的信號是SIGKILL,即exit。exit信號不會被系統阻塞,所以kill -9能順利殺掉進程。
除此之外,還可以通過進程名來殺死進程,這就需要使用killall命令,如:killall gedit
