ps命令顯示程序狀態解析
阿新 • • 發佈:2019-01-26
使用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那一列每個字母表示的含義.
我們知道程序分為如下幾種狀態:
- 執行(正在執行或在執行佇列中等待)
- 中斷(休眠中, 受阻, 在等待某個條件的形成或接受到訊號)
- 不可中斷(收到訊號不喚醒和不可執行, 程序必須等待直到有中斷髮生)
- 僵死(程序已終止, 但程序描述符存在, 直到父程序呼叫wait4()系統呼叫後釋放)
- 停止(程序收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU訊號後停止執行執行)
在ps命令上面的STAT上的相應狀態碼如下:
狀態 | 定義 |
---|---|
R | Running.執行中 |
S | Interruptible Sleep.等待呼叫 |
D | Uninterruptible Sleep.等待磁碟IO |
T | Stoped.暫停或者跟蹤狀態 |
X | Dead.即將被撤銷 |
Z | Zombie.程序已經結束,僅映像名留存 |
W | Paging.記憶體交換 |
N | 優先順序低的程序 |
< | 優先順序高的程序 |
s | 程序的領導者 |
L | 鎖定狀態 |
l | 多執行緒狀態 |
+ | 前臺程序 |
平時在檢視linux程序狀態時,檢視最多的三個狀態是R S D
R狀態,不必多說,R就是running的縮寫,即執行中的程序。
S 即 sleep程序,休眠程序。其又分為兩種:
- Interruptible Sleep(可中斷睡眠,在ps命令中顯示“S”)。處在這種睡眠狀態的程序是可以通過給它傳送signal來喚醒的,比如發HUP訊號給nginx的master程序可以讓nginx重新載入配置檔案而不需要重新啟動nginx程序;
- 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 殺掉) 。
以備查詢使用.