問題描述
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 系統了。