天天看點

Linux ps指令

問題描述

NFS服務故障, ps到的程序顯示狀态為D, 無法使用 kill 殺掉.

了解ps

ps是process status的縮寫, 用于列出系統中目前運作的程序快照.

root@kub3:/home/nfs# ps -aux | grep nfs
root      1937  0.0  0.0      0     0 ?        S<   Jul16   0:00 [nfsd4_callbacks]
root      1940  0.0  0.0      0     0 ?        D    Jul16   0:00 [nfsd]
root      1941  0.0  0.0      0     0 ?        D    Jul16   0:00 [nfsd]
root      1942  0.0  0.0      0     0 ?        D    Jul16   0:01 [nfsd]
root      1943  0.0  0.0      0     0 ?        D    Jul16   0:02 [nfsd]
root      1944  0.0  0.0      0     0 ?        D    Jul16   0:03 [nfsd]
root      1945  0.0  0.0      0     0 ?        D    Jul16   0:06 [nfsd]
root      1946  0.0  0.0      0     0 ?        D    Jul16   0:50 [nfsd]
root      1947  0.0  0.0      0     0 ?        D    Jul16   4:25 [nfsd]
root      3080  0.0  0.0      0     0 ?        S<   Jul16   0:00 [nfsiod]
root     10578  0.0  0.0  14224   920 pts/18   S+   11:57   0:00 grep --color=auto nfs
root     13380  0.0  0.2  37648 16904 ?        Ssl  Jul26   8:48 /nfs-client-provisioner
root     24271  0.0  0.0  16300   892 ?        D    Sep28   0:00 ls --color=auto /home/nfs/admin-d2069c-storage-mysql-2-pvc-ce20ad71-c2f4-11e8-b599-0050568eef9f/mysql/
root     25956  0.0  0.0   7316   700 pts/17   D+   10:55   0:00 rm -rf /home/nfs/admin-d2069c-storage-mysql-2-pvc-ce20ad71-c2f4-11e8-b599-0050568eef9f/           

ps程序狀态碼

ps出的程序狀态碼共有5種:

R 運作 runnable :運作(正在運作或在運作隊列中等待)
D uninterruptible sleep (usually IO), 不可中斷(收到信号不喚醒和不可運作, 程序必須等待直到有中斷發生)
S sleeping, 中斷(休眠中, 受阻, 在等待某個條件的形成或接受到信号)
T traced or stopped, 停止(程序收到SIGSTOP, SIGTSTP, SIGTTIN, SIGTTOU信号後停止運作運作)
Z a defunct (”zombie”) process, 僵死(程序已終止, 但程序描述符存在, 直到父程序調用wait4()系統調用後釋放)           

ps指令參數

-A 顯示所有程序
c 顯示程序的真實名稱
-e 等于“-A”
e 顯示環境變量
f 顯示程式間的關系
-H 顯示樹狀結構
r 顯示目前終端的程序
T 顯示目前終端的所有程式
u 指定使用者的所有程序, 例如: ps -u root
-au 顯示較詳細的資訊
-aux 列出目前所有的正在記憶體中的程式
-ef 顯示所有程序資訊,連同指令行           

D狀态分析

Linux程序睡眠狀态

Linux 程序有兩種睡眠狀态,一種 interruptible sleep,處在這種睡眠狀态的程序可以通過給它發信号來喚醒,例如kill -9 ;一種 uninterruptible sleep,這種狀态的程序不接受外來的任何信号,kill 不起作用, 無論是 kill -9 / kill -15,因為這種狀态程序根本不接受這些信号的支配。

D狀态原因

    處于 uninterruptible sleep 狀态的程序通常是在等待 IO,比如磁盤 IO,網絡 IO,其他外設 IO,如果程序正在等待的 IO 在較長的時間内都沒有響應,很有可能有 IO 出了問題,可能是外設本身出了故障,也可能是比如挂載的遠端檔案系統已經不可通路了,我這裡遇到的問題就是由 down 掉的 NFS 伺服器引起的。

    正是因為得不到 IO 的相應,程序才進入了 uninterruptible sleep 狀态,是以要想使程序從 uninterruptible sleep 狀态恢複,就得使程序等待的 IO 恢複,比如如果是因為從遠端挂載的 NFS 卷不可通路導緻程序進入 uninterruptible sleep 狀态的,那麼可以通過恢複該 NFS 卷的連接配接來使程序的 IO 請求得到滿足,除此之外,要想幹掉處在 D 狀态程序就隻能重新開機整個 Linux 系統了。

繼續閱讀