ps命令显示进程状态解析

使用ps -ax可以看到显示的信息如下:

 PID TTY      STAT   TIME COMMAND
    1 ?        Ss     0:01 /sbin/init
    2 ?        S      0:00 [kthreadd]
    3 ?        S      0:00 [ksoftirqd/0]
    5 ?        S<     0:00 [kworker/0:0H]
    7 ?        S      0:16 [rcu_sched]
    8 ?        S      0:00 [rcu_bh]
    9 ?        S      0:10 [rcuos/0]
   10 ?        S      0:00 [rcuob/0]
   11 ?        S      0:00 [migration/0]
   12 ?        S      0:00 [watchdog/0]
   13 ?        S      0:00 [watchdog/1]
   14 ?        S      0:00 [migration/1]
   15 ?        S      0:00 [ksoftirqd/1]
   17 ?        S<     0:00 [kworker/1:0H]
   18 ?        S      0:03 [rcuos/1]
   19 ?        S      0:00 [rcuob/1]
   20 ?        S      0:00 [watchdog/2]
   21 ?        S      0:00 [migration/2]
   22 ?        S      0:00 [ksoftirqd/2]
   24 ?        S<     0:00 [kworker/2:0H]
   25 ?        S      0:08 [rcuos/2]
   26 ?        S      0:00 [rcuob/2]
   27 ?        S      0:00 [watchdog/3]
   28 ?        S      0:00 [migration/3]
   29 ?        S      0:00 [ksoftirqd/3]
   31 ?        S<     0:00 [kworker/3:0H]
   32 ?        S      0:03 [rcuos/3]
   33 ?        S      0:00 [rcuob/3]
   34 ?        S<     0:00 [khelper]
   35 ?        S      0:00 [kdevtmpfs]
   36 ?        S<     0:00 [netns]
   37 ?        S<     0:00 [perf]
   38 ?        S      0:00 [khungtaskd]
   39 ?        S<     0:00 [writeback]
   40 ?        SN     0:00 [ksmd]
   41 ?        SN     0:01 [khugepaged]
   42 ?        S<     0:00 [crypto]
   43 ?        S<     0:00 [kintegrityd]
   44 ?        S<     0:00 [bioset]
   45 ?        S<     0:00 [kblockd]
   47 ?        S<     0:00 [ata_sff]
   48 ?        S<     0:00 [md]
   49 ?        S<     0:00 [devfreq_wq]
   53 ?        S      0:00 [kswapd0]
   54 ?        S      0:00 [fsnotify_mark]
   55 ?        S      0:00 [ecryptfs-kthrea]
   66 ?        S<     0:00 [kthrotld]
   67 ?        S<     0:00 [acpi_thermal_pm]
   72 ?        S<     0:00 [ipv6_addrconf]
   92 ?        S<     0:00 [deferwq]
   93 ?        S<     0:00 [charger_manager]
  145 ?        S      0:00 [scsi_eh_0]
  146 ?        S<     0:00 [scsi_tmf_0]
  147 ?        S      0:00 [scsi_eh_1]
  148 ?        S<     0:00 [scsi_tmf_1]
  149 ?        S<     0:00 [kpsmoused]
  150 ?        S      0:00 [scsi_eh_2]
  151 ?        S<     0:00 [scsi_tmf_2]
  152 ?        S      0:00 [scsi_eh_3]
  153 ?        S<     0:00 [scsi_tmf_3]
  171 ?        S      0:00 [jbd2/sda6-8]
  172 ?        S<     0:00 [ext4-rsv-conver]
  205 ?        S<     0:00 [kworker/0:1H]
  298 ?        S      0:00 upstart-udev-bridge --daemon
  303 ?        Ss     0:00 /lib/systemd/systemd-udevd --daemon
  337 ?        S<     0:00 [kworker/3:1H]
  338 ?        S<     0:00 [kworker/2:1H]
  339 ?        S      0:00 [irq/29-mei_me]
  417 ?        S<     0:00 [kvm-irqfd-clean]
  482 ?        S      0:00 upstart-socket-bridge --daemon
  591 ?        S      0:01 [jbd2/sda8-8]
  592 ?        S<     0:00 [ext4-rsv-conver]
  611 ?        S<     0:00 [kworker/1:1H]
  625 ?        Ss     0:00 smbd -F
  662 ?        S      0:00 upstart-file-bridge --daemon
  666 ?        Ssl    0:00 rsyslogd
  671 ?        Ss     0:00 dbus-daemon --system --fork
  689 ?        Ss     0:00 /usr/sbin/bluetoothd
  741 ?        Ss     0:00 /lib/systemd/systemd-logind
  760 ?        S      0:02 avahi-daemon: running [bj08730pcw.local]
  762 ?        S      0:00 avahi-daemon: chroot helper
  790 ?        S<     0:00 [krfcommd]
  841 tty4     Ss+    0:00 /sbin/getty -8 38400 tty4
  851 tty5     Ss+    0:00 /sbin/getty -8 38400 tty5
  852 ?        Ssl    0:02 thermald --no-daemon --dbus-enable
  868 tty2     Ss+    0:00 /sbin/getty -8 38400 tty2
  869 tty3     Ss+    0:00 /sbin/getty -8 38400 tty3
  872 tty6     Ss+    0:00 /sbin/getty -8 38400 tty6
  926 ?        Ss     0:00 /usr/sbin/sshd -D
  941 ?        Ss     0:00 /usr/sbin/vsftpd
  977 ?        Ss     0:00 /usr/sbin/cups-browsed
 1027 ?        Ss     0:00 acpid -c /etc/acpi/events -s /var/run/acpid.socket
 1031 ?        Ss     0:01 /usr/sbin/irqbalance
 1033 ?        Ss     0:00 cron
 1037 ?        Ssl    0:00 NetworkManager
 1058 ?        Sl     0:00 /usr/lib/policykit-1/polkitd --no-debug
 1068 ?        Ssl    0:00 whoopsie
 1072 ?        S      0:00 smbd -F
 1074 ?        S      0:00 smbd -F
 1077 ?        Sl     0:00 /opt/pbis/sbin/lwsmd --start-as-daemon
 1100 ?        Sl     0:00 lw-container lwreg
 1128 ?        Sl     0:00 lw-container eventlog
 1154 ?        Sl     0:00 lw-container netlogon
 1179 ?        Sl     0:00 lw-container lwio
 1206 ?        Sl     0:02 lw-container lsass
 1238 ?        Sl     0:00 lw-container reapsysl
 1293 ?        Ss     0:00 /usr/sbin/kerneloops
 1314 ?        S      0:11 /usr/sbin/snmpd -Lsd -Lf /dev/null -u snmp -g snmp -I -smux mteTrigger mteTriggerConf -p /var/run/snmpd.pid
 1334 ?        S      0:00 /usr/sbin/xrdp
 1336 ?        S      0:00 /usr/sbin/xrdp-sesman
 1421 tty1     Ss+    0:00 /sbin/getty -8 38400 tty1
 1436 ?        SLsl   0:00 lightdm
 1448 tty7     Ssl+   8:17 /usr/bin/X -core :0 -seat seat0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch
 1451 ?        Sl     0:00 /usr/lib/accountsservice/accounts-daemon
 1475 ?        S      0:00 [kauditd]
 1486 ?        S      0:00 /sbin/dhclient -d -sf /usr/lib/NetworkManager/nm-dhcp-client.action -pf /run/sendsigs.omit.d/network-manager.dhclient-eth0.pid -lf /var/lib/NetworkManager/dhclient-7bdd85c1-525f-
 1524 ?        Sl     0:00 lightdm --session-child 12 19
19284 pts/0    R+     0:00 ps -ax

下面就来分析STAT那一列每个字母表示的含义.

我们知道进程分为如下几种状态:

  1. 运行(正在运行或在运行队列中等待)
  2. 中断(休眠中, 受阻, 在等待某个条件的形成或接受到信号)
  3. 不可中断(收到信号不唤醒和不可运行, 进程必须等待直到有中断发生)
  4. 僵死(进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放)
  5. 停止(进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行运行)

在ps命令上面的STAT上的相应状态码如下:

状态定义
RRunning.运行中
SInterruptible Sleep.等待调用
DUninterruptible Sleep.等待磁盘IO
TStoped.暂停或者跟踪状态
XDead.即将被撤销
ZZombie.进程已经结束,仅映像名留存
WPaging.内存交换
N优先级低的进程
<优先级高的进程
s进程的领导者
L锁定状态
l多线程状态
+前台进程

平时在查看linux进程状态时,查看最多的三个状态是R S D
R状态,不必多说,R就是running的缩写,即运行中的进程。
S 即 sleep进程,休眠进程。其又分为两种:

  1. Interruptible Sleep(可中断睡眠,在ps命令中显示“S”)。处在这种睡眠状态的进程是可以通过给它发送signal来唤醒的,比如发HUP信号给nginx的master进程可以让nginx重新加载配置文件而不需要重新启动nginx进程;
  2. Uninterruptible Sleep(不可中断睡眠,在ps命令中显示“D”)。处在这种状态的进程不接受外来的任何signal,这也是为什么之前我无法用kill杀掉这些处于D状态的进程,无论是“kill”, “kill -9”还是“kill -15”,因为它们压根儿就不受这些信号的支配。Uninterruptible Sleep(不可中断睡眠,在ps命令中显示“D”)。处在这种状态的进程不接受外来的任何signal,这也是为什么之前我无法用kill杀掉这些处于D状态的进程,无论是“kill”, “kill -9”还是“kill -15”,因为它们压根儿就不受这些信号的支配。

D 即上面提到的Uninterruptible Sleep ,如果从广义上来分,D状态算是一种特殊的S状态进程。进程为什么会被置于D状态呢?

D状态的进程通常是在等待IO,比如磁盘IO,网络IO,其他外设IO,如果进程正在等待的IO在较长的时间内都没有响应,那么就很会不幸地被ps看到了,同时也就意味着很有可能有IO出了问题,可能是外设本身出了故障,也可能是比如NFS挂载的远程文件系统已经不可访问了。

正是因为得不到IO的响应,进程才进入了uninterruptible sleep状态,所以要想使进程从uninterruptible sleep状态恢复,就得使进程等待的IO恢复,比如如果是因为从远程挂载的NFS卷不可访问导致进程进入uninterruptible sleep状态的,那么可以通过恢复该NFS卷的连接来使进程的IO请求得到满足,除此之外,要想干掉处在D状态进程就只能重启整个Linux系统(D进程并不能通过kill /kill -9/killall 杀掉) 。

以备查询使用.

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值