问题描述
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 系统了。