每天一個linux命令:ps

每天一個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命令實戰》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章