Linux的ps命令顯示進程狀態解析
使用ps -ax可以看到顯示的信息如下:
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 殺掉) 。
以備查詢使用.
————————————————
版權聲明:本文為CSDN博主「悟空明鏡」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/wukongmingjing/article/details/83616469