每天一個linux命令:ps
1.命令功能
ps 即 Process Status, 顯示系統進程快照。ps 提供的查看結果並不動態連續的;如果想對進程動態監控,應該用 top 工具。kill 命令用於殺死進程。
linux上進程有5種狀態:
- 運行(正在運行或在運行隊列中等待)
- 中斷(休眠中, 受阻, 在等待某個條件的形成或接受到信號)
- 不可中斷(收到信號不喚醒和不可運行, 進程必須等待直到有中斷髮生)
- 僵死(進程已終止, 但進程描述符存在, 直到父進程調用wait4()系統調用後釋放)
- 停止(進程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信號後停止運行運行)
上面五種狀態對應的 ps 的5種狀態碼:
- R 運行 runnable (on run queue)
- S 中斷 sleeping
- D 不可中斷 uninterruptible sleep (usually IO)
- Z 僵死 a defunct (”zombie”) process
- T 停止 traced or stopped
其他狀態碼:
- P 等待交換頁
- W 無駐留頁 has no resident pages 沒有足夠的記憶體分頁可分配。
- X 死掉的進程
- < 高優先級進程 高優先序的進程
- N 低優先 級進程 低優先序的進程
- L 內存鎖頁 Lock 有記憶體分頁分配並縮在記憶體內
- s 進程的領導者(在它之下有子進程);
- l 多進程的(使用 CLONE_THREAD, 類似 NPTL pthreads)
- 位於後臺的進程組
2.命令格式
ps [選項]
3.命令參數
ps 的 命令參數分爲 UNIX 風格選項 和 BSD 風格選項,兩種選項非常多並且複雜。本文只列出一些常用的選項。更詳細的可以查看系統的man手冊。
-a 顯示所有進程
-c 顯示進程的真實名稱
-N 反向選擇
-e 等於“-a”
-f 顯示程序間的關係
-H 顯示樹狀結構
-r 顯示當前終端的進程
-T 顯示當前終端的所有程序
-u 以用戶爲主的格式來顯示程序狀況
-x 顯示所有程序,不以終端機來區分
-C<命令> 列出指定命令的狀況
--lines<行數> 每頁顯示的行數
--width<字符數> 每頁顯示的字符數
--sort <keywords> 指定排序方式
4.使用場景
ps 可用參數非常多,下面列舉幾個常用的。
場景1:不加參數運行
$ ps
PID TTY TIME CMD
11030 pts/11 00:00:00 bash
19105 pts/11 00:00:00 ps
如上所示,如果不加參數運行,只會顯示本控制檯啓動的程序,顯示信息很少,所以基本不會這麼用。
場景2:顯示所有進程
命令如下:
$ ps -aux 或 ps -ef
以上命令也是最常用的命令,ps aux 和 ps -ef 都是用來顯示當前運行的進程,但是,
ps aux 是用BSD的格式來顯示進程,顯示的項目有:
USER , PID , %CPU , %MEM , VSZ , RSS , TTY , STAT , START , TIME , COMMAND
ps -ef 是用標準的格式顯示進程,顯示的項目有:
UID , PID , PPID , C , STIME , TTY , TIME , CMD
兩者的輸出結果差別不大,但展示風格不同。aux是BSD風格,-ef是System V風格。這是次要的區別,一個影響使用的區別是aux會截斷command列,而-ef不會。當結合grep時這種區別會影響到結果。
以上命令輸出結果很多,爲了便於查看一般會結合分頁命令(less、more、pg等)和管道一同使用,如下:
$ ps -aux | less
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 193624 5480 ? Ss 2017 0:09 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
root 2 0.0 0.0 0 0 ? S 2017 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 2017 0:01 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< 2017 0:00 [kworker/0:0H]
root 7 0.0 0.0 0 0 ? S 2017 0:00 [migration/0]
上文命令頭的釋義如下:
USER:該 process 屬於那個使用者賬號的
PID :該 process 的號碼
%CPU:該 process 使用掉的 CPU 資源百分比
%MEM:該 process 所佔用的物理內存百分比
VSZ :該 process 使用掉的虛擬內存量 (Kbytes)
RSS :該 process 佔用的固定的內存量 (Kbytes)
TTY :該 process 是在那個終端機上面運作,若與終端機無關,則顯示 ?,另外, tty1-tty6 是本機上面的登入者程序,若爲 pts/0 等等的,則表示爲由網絡連接進主機的程序。
STAT:該程序目前的狀態,主要的狀態有
START:該 process 被觸發啓動的時間
TIME :該 process 實際使用 CPU 運作的時間
COMMAND:該程序的實際指令
狀態碼的含義可以參考文首部分。
場景3:查找特定進程
上文場景2中已經可以獲取所有進程信息,那麼查找特定進程只要參考我們前面的文章《每天一個Linux命令:grep》即可找到方法。
使用方法如下:
$ ps -aux | grep service
root 9206 2.8 0.3 5626060 52112 ? Ssl 2017 494:10 python rest_api_service.py restart
root 12846 0.0 0.0 112648 968 pts/11 R+ 11:13 0:00 grep --color=auto service
場景4:通過cpu和內存使用來過濾進程
默認的結果集是未排好序的。可以通過 –sort命令來排序。
根據 CPU 使用來升序排序:
ps -aux –sort -pcpu | less
根據 內存使用 來升序排序:
ps -aux –sort -pmem | less
我們也可以將它們合併到一個命令:
ps -aux –sort -pcpu,+pmem | less
或者按照命令排序:
ps -aux –sort -cmd | less
排序鍵值很多,常用如下:
KEY LONG DESCRIPTION
c cmd simple name of executable
C pcpu cpu utilization
g pgrp process group ID
j cutime cumulative user time
J cstime cumulative system time
k utime user time
p pid process ID
P ppid parent process ID
u user user name
...
擴展
前期已經講過通過 top 命令動態監控進程信息,本文不再重複。
(1)pstree
pstree命令將所有行程以樹狀圖顯示,樹狀圖將會以 pid (如果有指定) 或是以 init 這個基本行程爲根 (root),如果有指定使用者 id,則樹狀圖會只顯示該使用者所擁有的行程。
主要選項如下:
-a 顯示每個程序的完整指令,包含路徑,參數或是常駐服務的標示。
-c 不使用精簡標示法。
-G 使用VT100終端機的列繪圖字符。
-h 列出樹狀圖時,特別標明現在執行的程序。
-H <程序識別碼> 此參數的效果和指定”-h”參數類似,但特別標明指定的程序。
-l 採用長列格式顯示樹狀圖。
-n 用程序識別碼排序。預設是以程序名稱來排序。
-p 顯示程序識別碼。
-u 顯示用戶名稱。
-U 使用UTF-8列繪圖字符。
-V 顯示版本信息。
示例:
$ pstree
systemd─┬─NetworkManager───2*[{NetworkManager}]
├─agetty
├─auditd───{auditd}
├─crond
├─dbus-daemon───{dbus-daemon}
├─ipmievd
├─irqbalance
├─master─┬─pickup
│ └─qmgr
├─mysqld───27*[{mysqld}]
├─polkitd───5*[{polkitd}]
├─python───1080*[{python}]
├─python───151*[{python}]
├─python───11*[{python}]
├─rsyslogd───2*[{rsyslogd}]
├─2*[screen───bash───python───{python}]
├─screen───bash───python
├─screen─┬─2*[bash]
│ └─bash───python───8*[{python}]
├─sshd─┬─2*[sshd───bash───tmux]
│ └─2*[sshd───sftp-server]
├─systemd-journal
├─systemd-logind
├─systemd-udevd
├─tmux─┬─3*[bash]
│ ├─bash───tail
│ ├─6*[bash───ssh]
│ ├─bash───python───python
│ └─bash───pstree
└─tuned───4*[{tuned}]
(2)pstack
pstack命令可顯示每個進程的棧跟蹤。pstack 命令必須由相應進程的屬主或 root 運行。可以使用 pstack 來確定進程掛起的位置。此命令允許使用的唯一選項是要檢查的進程的 PID。
這個命令很多系統軟件倉庫並沒有,需要自己搜索相關源下載安裝,所以這裏只提示一下,感興趣的同學可以自己研究。
我更常用的命令是:strace。當一個程序運行出錯,而我們又沒有程序源碼時,strace 是調試利器。
strace命令是一個集診斷、調試、統計與一體的工具,我們可以使用strace對應用的系統調用和信號傳遞的跟蹤結果來對應用進行分析,以達到解決問題或者是瞭解應用工作過程的目的。
strace常用來跟蹤進程執行時的系統調用和所接收的信號。 在Linux世界,進程不能直接訪問硬件設備,當進程需要訪問硬件設備(比如讀取磁盤文件,接收網絡數據等等)時,必須由用戶態模式切換至內核態模式,通 過系統調用訪問硬件設備。strace可以跟蹤到一個進程產生的系統調用,包括參數,返回值,執行消耗的時間。
最後
關於 ps 命令,推薦參考博文:《10個重要的Linux ps命令實戰》