Linux ps命令詳解


一、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

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM