進程查看器 - ps 命令

2021-03-02 Linux開發那些事兒

ps 命令是 process status 的簡寫,主要用於查詢當前正在運行中進程的信息,它從 /proc/進程ID 目錄中讀取指定進程ID的信息

語法
ps [options]

ps 的選項非常多,總共有一百多個選項,可以通過 ps L | wc -l 命令查看ps的選項數量

這篇文章主要介紹 ps 命令的一些常用的用法,對於一些使用頻率很低的選項不在這裡討論

選項風格

根據選項前是否有 -,ps命令的選項可以分成以下幾種風格

UNIX風格: 選項前面必須以 - 開頭

BSD分格: 選項前面必須不能以 - 開頭

GNU風格: 選項前面必須以 -- 開頭

[root@ecs-centos-7 ~]# ps p 842
PID TTY STAT TIME COMMAND
842 ? Sl 12:55 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
[root@ecs-centos-7 ~]# ps -p 842
PID TTY TIME CMD
842 ? 00:12:55 mysqld
[root@ecs-centos-7 ~]# ps --pid 842
PID TTY TIME CMD
842 ? 00:12:55 mysqld

上面的例子中 ps p 842和 ps -p 842 以及 ps --pid 842 都是查詢進程ID為842的進程信息,只不過分別用ps命令選項的 BSD風格、UNIX風格、GNU風格而已

注意:ps命令選項可以混用不同風格的選項,但是可能會出現衝突,兼容混用的主要原因是幫助過度舊的腳本和習慣,我們實際使用的時候儘量使用同一種風格的選項

所有運行中的進程

通過 ps -A 或者 ps -e 命令可以查看所有運行中的進程

[tt@ecs-centos-7 ~]$ ps -fA | more
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Aug14 ? 00:00:07 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 2 0 0 Aug14 ? 00:00:00 [kthreadd]
root 4 2 0 Aug14 ? 00:00:00 [kworker/0:0H]

[tt@ecs-centos-7 ~]$ ps -fe | more
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Aug14 ? 00:00:07 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 2 0 0 Aug14 ? 00:00:00 [kthreadd]
root 4 2 0 Aug14 ? 00:00:00 [kworker/0:0H]

列說明:

UID: 進程所屬的用戶
PID: 進程ID
PPID: 進程的父進程ID
C: 同 %CPU,進程CPU利用率
STIME: 進程啟動的日期
TTY: 進程相關的終端
TIME: 進程佔用的總CPU時間
CMD: 進程啟動命令以及參數

-f 或 -F選項:全格式列表選項,這個選項和其他UNIX風格的選項組合使用可以使得結果多出一些列

上面例子中 -A 和 -e 選項都是查看所有運行的進程信息的,後面重定向到 more 命令是為了分頁查看結果

查看指定用戶的進程

-u、-U、U、--user、--User 這幾個選項後面接用戶名列表(用戶名之間用逗號分隔) 或用戶ID列表(ID之間用逗號分隔) , 可以查看指定用戶列表中用戶的進程

[root@ecs-centos-7 ~]# ps -u tt
PID TTY TIME CMD
13087 pts/8 00:00:00 bash
13257 pts/9 00:00:00 bash
[root@ecs-centos-7 ~]# ps -u wl
PID TTY TIME CMD
13275 pts/11 00:00:00 bash
13294 pts/11 00:00:00 top

[root@ecs-centos-7 ~]# ps -u tt,wl
PID TTY TIME CMD
13087 pts/8 00:00:00 bash
13257 pts/9 00:00:00 bash
13275 pts/11 00:00:00 bash
13294 pts/11 00:00:00 top

上面例子中分別查看了用戶 tt 和 wl 的進程,用戶列表tt,wl的進程實際上是列表中每個用戶的進程組合

[root@ecs-centos-7 ~]# id tt
uid=1003(tt) gid=1003(tt) groups=1003(tt)
[root@ecs-centos-7 ~]# id wl
uid=1000(wl) gid=1000(wl) groups=1000(wl)

[root@ecs-centos-7 ~]# ps -u 1003
PID TTY TIME CMD
13087 pts/8 00:00:00 bash
13257 pts/9 00:00:00 bash
[root@ecs-centos-7 ~]# ps -u 1000
PID TTY TIME CMD
13275 pts/11 00:00:00 bash
13294 pts/11 00:00:00 top

[root@ecs-centos-7 ~]# ps -u 1003,1000
PID TTY TIME CMD
13087 pts/8 00:00:00 bash
13257 pts/9 00:00:00 bash
13275 pts/11 00:00:00 bash
13294 pts/11 00:00:00 top

上面例子中分別按照用戶tt和wl的用戶ID 查看進程, 用戶ID列表1003,1000的進程實際上是列表中每個用戶ID的進程組合

查看指定進程ID的進程

ps p 進程ID、ps -p 進程ID、ps --pid 進程ID 這三種方式都可以查看指定進程ID的進程信息

[root@ecs-centos-7 ~]# ps -p 1,2,4
PID TTY TIME CMD
1 ? 00:00:07 systemd
2 ? 00:00:00 kthreadd
4 ? 00:00:00 kworker/0:0H

上面例子中查看進程ID分別為 1,2,4 的進程信息,使用 ps p 1,2,4 命令或者 ps --pid 1,2,4 命令也可以得到和例子中一樣的結果

查看線程

知道了進程ID,可以通過 ps -fL -p 進程ID 命令查看指定進程的線程信息

[root@ecs-centos-7 ~]# ps -fL -p 842
UID PID PPID LWP C NLWP STIME TTY TIME CMD
mysql 842 1 842 0 27 Aug14 ? 00:00:00 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
mysql 842 1 1043 0 27 Aug14 ? 00:00:00 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
mysql 842 1 1061 0 27 Aug14 ? 00:00:37 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid

線程相關欄位說明:

LWP: 線程ID
NLWP: 線程數量

上面的例子查看進程ID為842的進程(MySQL進程)的線程信息,由於輸出信息太多,這裡只截取了一部分,從結果可以看出,MySQL進程有27個線程,其中 PID 和 LWP 值相同的是主線程

根據進程名字獲得進程ID

在伺服器開發中,關閉伺服器進程的時候,通常都需要根據進程名字取得進程ID,然後再利用 kill 命令向指定進程ID發送終止信號

[root@ecs-centos-7 ~]# ps aux | grep mysql | grep -v grep | awk '{print $2}'
842

上面的例子中,ps aux 是查找所有用戶運行的進程,grep mysql 是從前面查找的結果中過濾出含有mysql的關鍵字,grep -v grep 是從上一步的結果中進一步去掉含有 grep 的關鍵字,最後 awk '{print $2} 是輸出最終結果中第二列的值,也即MySQL的進程ID

注意:ps命令查找的結果中程序啟動命令以及參數(CMD列)最多只能顯示15個字符寬度,如果應用程式名字查過15字符長度,就會被截斷,此時用 grep 查找應用程式名字的話會出現找不到應用程式的情況。關於這個問題請參考ps 命令顯示不完整的問題

總結

在對 Linux 系統中問題進行故障排除的過程中,ps命令是常用的命令之一,它有很多的選項,但是大多數時候都在使用 ps aux 或者 ps -ef 命令查看正在運行進程的信息

有關 ps 命令更多選項可以通過 man ps命令查看



推薦閱讀

Linux 下top命令詳解

ps 命令顯示不完整的問題

相關焦點

  • 命令詳解第三篇:Linux如何查看進程、殺死進程、啟動進程等常用命令
    ps命令查找與進程相關的PID號:    ps a 顯示現行終端機下的所有程序,包括其他用戶的程序。    ps u 以用戶為主的格式來顯示程序狀況。    ps x 顯示所有程序,不以終端機來區分。       最常用的方法是ps aux,然後再通過管道使用grep命令過濾查找特定的進程,然後再對特定的進程進行操作。
  • Linux進程管理命令:nohup、&、jobs、fg、bg、ps、kill
    &3. jobs4. ps5. kill對Linux進程的管理是我們經常遇到的,如何查看一個進程的狀態?如何把一個後臺的進程調至進程執行?如何殺死一個進程.看了本文後,你將會全部掌握!& &用在一個命令的最後,可以把這個命令放到後臺執行,可以輸入jobs 查看後臺執行的命令。
  • 怎麼查看電腦進程 進程查看器怎麼禁用
    怎麼查看電腦進程呢?由於進程查看器會對電腦中運行的所有進程進行管理,因此惡意終止相關進程將造成系統的不穩定以及安全問題。對此我們需要對進程查看器進行管理。查看電腦進程的方法:最直接的查看電腦進程的方法,就是右擊任務欄,從其右鍵菜單中選擇「任務管理器」項。
  • linux下進程和線程狀態查看
    5、ps -mp <PID>手冊中說:m Show threads after processes這樣可以查看一個進程起的線程數。| wc -l查看線程其實linux沒有線程,都是用進程模仿的1. ps -ef f用樹形顯示進程和線程,比如說我想找到proftp現在有多少個進程/線程,可以用$ ps -ef f | grep proftpdnobody 23117 1 0 Dec23 ?
  • 殺死殭屍進程,你需要這些神奇高效的Linux命令行
    要了解 CPU、內存、進程、磁碟、網絡,這五大運維系統的運行狀態,需要掌握的運維命令有 ls、ps、free、top、uptime、ifconfig、su/sudo、dmesg、iostat、vmstat、sar、htop、iotop、smem 等命令。
  • Linux怎樣查詢出當前系統的所有進程
    本經驗已linux發行版Ubuntu為例,Linux下使用PS命令結合相關參數可以查看linux當前系統下的所有進程、所有運行中的進程、所有非root運行的進程、所有指定用戶運行的進程。使用搜索功能搜索「Terminal」,打開Ubuntu命令行終端。
  • 查看進程
    講解對象;查看進程背景:很多應用程式在後臺默認打開,長時間,計算機很卡,那麼怎麼關閉這些應用的進程呢?方法一:1 打開任務管理器,(Ctrl+Shitf+ESC或者Ctrl+Alt+Del)2 根據進程名稱,右擊點擊結束進程就行了(或者右鍵+E 或者直接左擊進程 Alt+E)方法二:我們也可以根據進程的PID號關閉軟體進程1 任務管理器的詳細信息有PID號,找到對應軟體PID號。
  • 常用ADB命令整理
    AD:測試行業最牛的圈子,7年以上經驗才可加入點擊上面連結加群* 查看設備adb devicesps這個命令是查看當前連接的設備, 連接到計算機的android設備或者模擬器將會列出顯示若有多臺安卓設備,可以通過在adb後面加上 -s <設備id> 對指定設備進行裝包
  • Java開發必會的Linux命令
    即時平時開發過程中不使用Linux(Unix)或者mac系統,也需要熟練掌握Linux命令。因為很多伺服器上都是Linux系統。所以,要和伺服器機器交互,就要通過shell命令。本文並不會對所有命令進行詳細講解,只給出常見用法和解釋。具體用法可以使用--help查看幫助或者直接通過google搜索學習。
  • linux常用命令總結
    (停止當前進程)ctrl + z 掛起當前進程,放後臺ctrl + r(查看命令歷史) historyctrl + l(清屏,與clear命令作用相同)方向箭頭 上 下 可以查看執行過的命令ctrl
  • 應急系列之㈠《Linux安全應急排查常用命令》
    工欲善其事,必先利其器。器欲盡其能,必先得其法。雖說思想是工具的靈魂,但是熟練使用工具往往可以事半功倍,請相信重複的力量。如果在Linux應急過程中,你連常用的命令還需要Google一下,那請你放棄治療。Linux應急排查常用命令部分,旨在讓你熟知應急過程中常用的Linux命令,使用命令過程中需要注意的關鍵點,為後續應急工作做鋪墊。
  • Linux 命令匯總
    命令功能說明線上查詢及幫助命令 (2 個)man查看命令幫助,命令的詞典,更複雜的還有 info,但不常用。help查看 Linux 內置命令的幫助,比如 cd 命令。文件和目錄操作命令 (18 個)ls全拼 list,功能是列出目錄的內容及其內容屬性信息。
  • Linux常用命令詳解
    pageup]:   向上翻動一頁實例:(1)ps查看進程信息並通過less分頁顯示ps -aux | less -N(2)查看多個文件less 1.log 2.log可以使用n查看下一個,使用p查看前一個head命令head 用來顯示檔案的開頭至標準輸出中,默認head命令列印其相應文件的開頭10行。
  • Linux(八)測試常用命令
    1、系統命令查看主機名:hostname查詢登錄系統的用戶:who
  • 20分鐘吃掉Linux常用命令40式
    26, ps 查看進程信息ps:process status例1:ps -u liangyun  #查看當前liangyun用戶全部進程信息例2:ps -alf   | grep python #查看當前所有和Python
  • 這23個linux常用命令必須會!
    3. tail 命令 : 查看文件內容tail 命令可用於查看文件的內容,有一個常用的參數 -f 常用於查閱正在改變的日誌文件。16. ps 命令 : 顯示當前進程狀態Linux ps 命令用於顯示當前進程 (process) 的狀態。
  • 前端應該會的23個linux常用命令
    常用 options2、rm 命令 : 刪除文件/目錄options:3、tail 命令 : 查看文件內容tail 命令可用於查看文件的內容,有一個常用的參數 -f 常用於查閱正在改變的日誌文件。tail -f filename 會把 filename 文件裡的最尾部的內容顯示在屏幕上,並且不斷刷新,只要 filename 更新就可以看到最新的文件內容。
  • Android 開發中常用 ADB 命令總結
    adb 的工作方式比較特殊,採用監聽 Socket TCP 5554 等埠的方式讓 IDE 和 Qemu 通訊,默認情況下 adb 會 daemon 相關的網絡埠,所以當我們運行 Eclipse 時 adb 進程就會自動運行。作為開發人員,掌握適當所需要的 ADB 操作命令是非常必須的。就把平時工作中用得相對比較多的 adb 命令作個小總結。1.
  • Linux nohup命令詳解,終端關閉程序依然可以在執行!
    這時我們就可以使用 nohup 這個命令。nohup 命令是英語詞組 no hangup 的縮寫,意思是不掛斷,也就是指程序不退出。這個命令會使程序忽略 HUP 信號,保證程序能夠正常進行。HUP 信號有些人可能比較陌生,它是在終端被中止的時候向它所關聯的進程所發出的信號,進程收到這個信號後就會中止運行。
  • 通過htop命令查看內存實際使用容量以及htop命令詳解
    /configuremake && make install3、使用:編譯安裝完成後即可使用htop命令查看,如圖非常直觀吧,非常好看吧以下是htop的詳細命令參數及使用說明各項從上至下分別說明如下:左邊部分從上至下,分別為,cpu、內存、交換分區的使用情況,右邊部分為:Tasks為進程總數,當前運行的進程數、Load average為系統1分鐘,5分鐘,10分鐘的平均負載情況、Uptime為系統運行的時間。