Linux ps命令-阿里云开发者社区

开发者社区> 数据库> 正文
登录阅读全文

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 系统了。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享: