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 命令顯示不完整的問題