1. 程式人生 > >linux每日命令(34):ps命令和pstree命令

linux每日命令(34):ps命令和pstree命令

淺析 tails 讓其 onf isp chl 信息 令行 如果

閱讀目錄(Content)

  • 一.命令格式:
  • 二.命令功能:
  • 三.命令參數:
  • 四. 使用實例
    • 1. 顯示所有進程信息
    • 2. 顯示指定用戶信息
    • 3. 顯示所有進程信息,連帶命令行
    • 4. ps 與grep 常用組合用法,查找特定進程
    • 5:將目前屬於您自己這次登入的 PID 與相關信息列示出來
    • 6.列出目前所有的正在內存當中的程序
      • ps工具標識進程的5種狀態碼
    • 7.以類似進程樹的結構顯示
    • 8. pstree命令更優雅的樹狀顯示
      • 以樹狀圖只顯示進程的名字,且相同進程合並顯示:
      • 以樹狀圖顯示進程同時還顯示PID:
      • 以樹狀圖顯示進程PID為的進程以及子孫進程,如果有-p參數則同時顯示每個進程的PID:
    • 9. 其他實例
  • linux上進程的幾種狀態
    • R(TASK_RUNNING),可執行狀態&運行狀態(在run_queue隊列裏的狀態)
    • S(TASK_INTERRUPTIBLE),可中斷的睡眠狀態,可處理signal
    • D(TASK_UNINTERRUPTIBLE),不可中斷的睡眠狀態,可處理signal,有延遲
    • Z(TASK_DEAD-EXIT_ZOMBIE)退出狀態,進程稱為僵屍進程,不可被kill,即不相應任務信號,無法用SIGKILL殺死
    • T(TASK_STOPPED or TASK_TRACED),暫停狀態或跟蹤狀態,不可處理signal,因為根本沒有時間片運行代碼
    • X(TASK_DEAD-EXIT_DEAD),退出狀態,進程即將被銷毀
    • 進程的初始狀態
    • 進程狀態變遷

Linux中的ps命令是Process Status的縮寫。ps命令用來列出系統中當前運行的那些進程。ps命令列出的是當前那些進程的快照,就是執行ps命令的那個時刻的那些進程,如果想要動態的顯示進程信息,就可以使用top命令。

要對進程進行監測和控制,首先必須要了解當前進程的情況,也就是需要查看當前進程,而 ps 命令就是最基本同時也是非常強大的進程查看命令。使用該命令可以確定有哪些進程正在運行和運行的狀態、進程是否結束、進程有沒有僵死、哪些進程占用了過多的資源等等。總之大部分信息都是可以通過執行該命令得到的。

ps 為我們提供了進程的一次性的查看,它所提供的查看結果並不動態連續的;如果想對進程時間監控,應該用 top 工具。

kill 命令用於殺死進程。

一.命令格式:

ps [參數]

二.命令功能:

用於顯示當前進程 (process) 的狀態。

三.命令參數:

ps 的參數非常多, 在此僅列出幾個常用的參數並大略介紹含義

參數描述
-A 列出所有的行程
-e 等於“-A”
-a 顯示現行終端機下的所有進程,包括其他用戶的進程;
-u 以用戶為主的進程狀態 ;
x 通常與 a 這個參數一起使用,可列出較完整信息。
-w 顯示加寬可以顯示較多的資訊
-au 顯示較詳細的資訊
-aux 顯示所有包含其他使用者的行程
-f 做一個更為完整的輸出。

四. 使用實例

1. 顯示所有進程信息

命令:

ps -A

輸出:

[root@localhost autoAweme]# ps -A
   PID TTY          TIME CMD
     1 ?        00:00:15 systemd
     2 ?        00:00:00 kthreadd
     3 ?        00:00:56 ksoftirqd/0
     5 ?        00:00:00 kworker/0:0H
     7 ?        00:01:01 migration/0
     8 ?        00:00:00 rcu_bh
     9 ?        00:18:57 rcu_sched
    10 ?        00:00:00 lru-add-drain
    11 ?        00:00:03 watchdog/0
    12 ?        00:00:02 watchdog/1
    13 ?        00:01:01 migration/1
    14 ?        00:00:56 ksoftirqd/1
    16 ?        00:00:00 kworker/1:0H
……省略部分結果

2. 顯示指定用戶信息

命令:

ps -u root

輸出:

[root@localhost autoAweme]# ps -u root
   PID TTY          TIME CMD
     1 ?        00:00:15 systemd
     2 ?        00:00:00 kthreadd
     3 ?        00:00:56 ksoftirqd/0
     5 ?        00:00:00 kworker/0:0H
     7 ?        00:01:01 migration/0
     8 ?        00:00:00 rcu_bh
     9 ?        00:18:57 rcu_sched
    10 ?        00:00:00 lru-add-drain
    11 ?        00:00:03 watchdog/0
    12 ?        00:00:02 watchdog/1
    13 ?        00:01:01 migration/1
    14 ?        00:00:56 ksoftirqd/1
    16 ?        00:00:00 kworker/1:0H
    18 ?        00:00:00 kdevtmpfs
    19 ?        00:00:00 netns
    20 ?        00:00:00 khungtaskd
……省略部分結果

說明:
顯示root進程用戶信息

3. 顯示所有進程信息,連帶命令行

命令:

ps -ef

輸出:

[root@localhost autoAweme]# ps -ef
UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 11月30 ?      00:00:15 /usr/lib/systemd/systemd --swi
root          2      0  0 11月30 ?      00:00:00 [kthreadd]
root          3      2  0 11月30 ?      00:00:56 [ksoftirqd/0]
root          5      2  0 11月30 ?      00:00:00 [kworker/0:0H]
root          7      2  0 11月30 ?      00:01:01 [migration/0]
……省略部分結果

4. ps 與grep 常用組合用法,查找特定進程

命令:

ps -ef|grep uwsgi

輸出:

[root@localhost autoAweme]# ps -ef|grep uwsgi
root      30568    795  0 12月01 ?      00:00:19 /home/hc/project/envs/pgc/bin/uwsgi --ini /home/hc/project/pgc.ini
root      30578  30568  0 12月01 ?      00:00:00 /home/hc/project/envs/pgc/bin/uwsgi --ini /home/hc/project/pgc.ini
root      66069    795  1 12:07 ?        00:04:29 /home/hc/project/envs/autoAweme/bin/uwsgi --ini /home/hc/project/autoAweme.ini
root      66096  66069  0 12:07 ?        00:00:01 /home/hc/project/envs/autoAweme/bin/uwsgi --ini /home/hc/project/autoAweme.ini
root      80022  86053  0 16:06 pts/1    00:00:00 grep --color=auto uwsgi

5:將目前屬於您自己這次登入的 PID 與相關信息列示出來

命令:

ps -l

輸出:

[root@localhost autoAweme]# ps -l
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0  85984  80319  0  80   0 - 58596 do_wai pts/1    00:00:00 su
4 S     0  86053  85984  0  80   0 - 29208 do_wai pts/1    00:00:01 bash
0 R     0 107795  86053  0  80   0 - 38300 -      pts/1    00:00:00 ps

說明:

各相關信息的意義

標誌意義
F 代表這個程序的旗標 (flag), 4 代表使用者為 super user
S 代表這個程序的狀態 (STAT),關於各 STAT 的意義將在內文介紹
UID 程序被該 UID 所擁有
PID 就是這個程序的 ID !
PPID 則是其上級父程序的ID
C CPU 使用的資源百分比
PRI 指進程的執行優先權(Priority的簡寫),其值越小越早被執行;
NI 這個進程的nice值,其表示進程可被執行的優先級的修正數值。
ADDR 這個是內核函數,指出該程序在內存的那個部分。如果是個 running的程序,一般就是 "-"
SZ 使用掉的內存大小
WCHAN 目前這個程序是否正在運作當中,若為 - 表示正在運作
TTY 登入者的終端機位置
TIME 使用掉的 CPU 時間。
CMD 所下達的指令為何

在預設的情況下, ps 僅會列出與目前所在的 bash shell 有關的 PID 而已,所以, 當我使用 ps -l 的時候,只有三個 PID。

6.列出目前所有的正在內存當中的程序

命令:

ps aux

輸出:

[root@localhost autoAweme]# ps aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.1 125804  4260 ?        Ss   11月30   0:15 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root          2  0.0  0.0      0     0 ?        S    11月30   0:00 [kthreadd]
root          3  0.0  0.0      0     0 ?        S    11月30   0:56 [ksoftirqd/0]
root          5  0.0  0.0      0     0 ?        S<   11月30   0:00 [kworker/0:0H]
root          7  0.0  0.0      0     0 ?        S    11月30   1:01 [migration/0]
root          8  0.0  0.0      0     0 ?        S    11月30   0:00 [rcu_bh]
root          9  0.3  0.0      0     0 ?        S    11月30  19:02 [rcu_sched]
……省略部分結果

說明:

標誌意義
USER 該 process 屬於那個使用者賬號的
PID 該 process 的號碼
%CPU 該 process 使用掉的 CPU 資源百分比
%MEM 該 process 所占用的物理內存百分比
VSZ 該 process 使用掉的虛擬內存量 (Kbytes)
RSS 該 process 占用的固定的內存量 (Kbytes)
TTY 該 process 是在那個終端機上面運作,若與終端機無關,則顯示 ?,另外, tty1-tty6 是本機上面的登入者程序,若為 pts/0 等等的,則表示為由網絡連接進主機的程序。
STAT 該程序目前的狀態
START 該 process 被觸發啟動的時間
TIME 該 process 實際使用 CPU 運作的時間
COMMAND 該程序的實際指令

STAT:該程序目前的狀態,主要的狀態有

ps工具標識進程的5種狀態碼

  • D :不可中斷 uninterruptible sleep (usually IO)
  • R :該程序目前正在運作,或者是可被運作
  • S :該程序目前正在睡眠當中 (可說是 idle 狀態),但可被某些訊號 (signal) 喚醒。
  • T :該程序目前正在偵測或者是停止了
  • Z :該程序應該已經終止,但是其父程序卻無法正常的終止他,造成 zombie (疆屍) 程序的狀態

7.以類似進程樹的結構顯示

命令:

ps -axjf

輸出:

[root@localhost autoAweme]# ps -axjf
  PPID    PID   PGID    SID TTY       TPGID STAT   UID   TIME COMMAND
     0      2      0      0 ?            -1 S        0   0:00 [kthreadd]
     2      3      0      0 ?            -1 S        0   0:57  \_ [ksoftirqd/0]
     2      5      0      0 ?            -1 S<       0   0:00  \_ [kworker/0:0H]
     2      7      0      0 ?            -1 S        0   1:02  \_ [migration/0]
……省略部分結果
     1  80310   2416   2416 ?            -1 Sl    1000   0:25 /usr/libexec/gnome-terminal-server
 80310  80318   2416   2416 ?            -1 S     1000   0:00  \_ gnome-pty-helper
 80310  80319  80319  80319 pts/1     28727 Ss    1000   0:00  \_ bash
 80319  85984  85984  80319 pts/1     28727 S        0   0:00      \_ su
 85984  86053  86053  80319 pts/1     28727 S        0   0:01          \_ bash
 86053  28727  28727  80319 pts/1     28727 R+       0   0:00              \_ ps -axjf

8. pstree命令更優雅的樹狀顯示

pstree命令以樹狀圖顯示進程間的關系(display a tree of processes)。ps命令可以顯示當前正在運行的那些進程的信息,但是對於它們之間的關系卻顯示得不夠清晰。在Linux系統中,系統調用fork可以創建子進程,通過子shell也可以創建子進程,Linux系統中進程之間的關系天生就是一棵樹,樹的根就是進程PID為1的init進程。

以樹狀圖只顯示進程的名字,且相同進程合並顯示:

命令:

pstree

輸出:

[root@localhost autoAweme]# pstree
systemd─┬─ModemManager───2*[{ModemManager}]
        ├─NetworkManager───2*[{NetworkManager}]
        ├─VGAuthService
        ├─2*[abrt-watch-log]
        ├─abrtd
        ├─accounts-daemon───2*[{accounts-daemon}]
        ├─alsactl
        ├─at-spi-bus-laun─┬─dbus-daemon
        │                 └─3*[{at-spi-bus-laun}]
        ├─at-spi2-registr───2*[{at-spi2-registr}]
        ├─atd
        ├─auditd─┬─audispd─┬─sedispatch
        │        │         └─{audispd}
        │        └─{auditd}
        ├─avahi-daemon───avahi-daemon
……省略部分結果

以樹狀圖顯示進程同時還顯示PID:

命令:

pstree -p

輸出:

[root@localhost autoAweme]# pstree -p
systemd(1)─┬─ModemManager(686)─┬─{ModemManager}(722)
           │                   └─{ModemManager}(744)
           ├─NetworkManager(796)─┬─{NetworkManager}(807)
           │                     └─{NetworkManager}(811)
           ├─VGAuthService(677)
           ├─abrt-watch-log(698)
           ├─abrt-watch-log(703)
           ├─abrtd(684)
           ├─accounts-daemon(680)─┬─{accounts-daemon}(699)
           │                      └─{accounts-daemon}(742)
           ├─alsactl(679)
           ├─at-spi-bus-laun(2636)─┬─dbus-daemon(2641)
           │                       ├─{at-spi-bus-laun}(2637)
           │                       ├─{at-spi-bus-laun}(2638)
           │                       └─{at-spi-bus-laun}(2640)
           ├─at-spi2-registr(2643)─┬─{at-spi2-registr}(2648)
           │                       └─{at-spi2-registr}(2649)
           ├─atd(1171)
……省略部分結果

以樹狀圖顯示進程PID為的進程以及子孫進程,如果有-p參數則同時顯示每個進程的PID:

命令:

pstree [-p] <pid>

輸出:

root@localhost autoAweme]# pstree 1244
mysqld_safe───mysqld───19*[{mysqld}]
[root@localhost autoAweme]# pstree -p 1244
mysqld_safe(1244)───mysqld(1869)─┬─{mysqld}(1906)
                                 ├─{mysqld}(1911)
                                 ├─{mysqld}(1912)
                                 ├─{mysqld}(1913)
                                 ├─{mysqld}(1914)
                                 ├─{mysqld}(1915)
                                 ├─{mysqld}(1916)
                                 ├─{mysqld}(1917)
                                 ├─{mysqld}(1918)
                                 ├─{mysqld}(1919)
                                 ├─{mysqld}(1920)
                                 ├─{mysqld}(1926)
                                 ├─{mysqld}(1927)
                                 ├─{mysqld}(1928)
                                 ├─{mysqld}(1929)
                                 ├─{mysqld}(1930)
                                 ├─{mysqld}(1931)
                                 ├─{mysqld}(2081)
                                 └─{mysqld}(77714)

以樹狀圖顯示進程,相同名稱的進程不合並顯示,並且會顯示命令行參數,如果有-p參數則同時顯示每個進程的PID。

命令:

pstree -a

輸出:

[root@localhost autoAweme]# pstree -a
systemd --switched-root --system --deserialize 22
  ├─ModemManager
  │   └─2*[{ModemManager}]
  ├─NetworkManager --no-daemon
  │   └─2*[{NetworkManager}]
  ├─VGAuthService -s
  ├─supervisord /usr/bin/supervisord -c /etc/supervisord.conf
  │   ├─celery /home/hc/project//envs/autoAweme/bin/celery worker -A celery_worker.celery -l info
  │   │   ├─celery /home/hc/project//envs/autoAweme/bin/celery worker -A celery_worker.celery -l info
  │   │   │   └─{celery}
  │   │   ├─celery /home/hc/project//envs/autoAweme/bin/celery worker -A celery_worker.celery -l info
  │   │   │   └─{celery}
  │   │   └─2*[{celery}]
  │   ├─uwsgi --ini /home/hc/project/pgc.ini
  │   │   └─uwsgi --ini /home/hc/project/pgc.ini
  │   └─uwsgi --ini /home/hc/project/autoAweme.ini
  │       ├─uwsgi --ini /home/hc/project/autoAweme.ini
  │       └─2*[{uwsgi}]
……省略部分結果

註:因為pstree輸出的信息可能比較多,所以最好與more/less配合使用,使用上下箭頭查看,按q退出。

pstree -p | less

 

9. 其他實例

  1. 可以用 | 管道和 more 連接起來分頁查看

命令:

ps -aux |more
  1. 把所有進程顯示出來,並輸出到ps001.txt文件

命令:

ps -aux > ps001.txt
  1. 輸出指定的字段

命令:

ps -o pid,ppid,pgrp,session,tpgid,comm

linux上進程的幾種狀態

下面內容來源於 https://blog.csdn.net/zy512638348/article/details/78193278

R(TASK_RUNNING),可執行狀態&運行狀態(在run_queue隊列裏的狀態)

只有在該狀態的進程才可能在CPU上運行,同一時刻可能有多個進程處於可執行狀態,這些進程的task_struct結構(進程控制塊)被放入對應的CPU的可執行隊列中(一個進程最多只能出現在一個CPU的可執行隊列中)。進程調度器的任務就是從各個CPU的可執行隊列中分別選擇一個進程在該CPU上運行。

一般將正在CPU上執行的進程定義為RUNNING狀態,而將可執行但是尚未被調度執行的進程定義為READY狀態,這兩種狀態在linux下同一為TASK_RUNNING狀態。只要可執行隊列不為空,其對應的CPU就不能偷懶,就要執行其中某個進程。一般稱此時的CPU“忙碌”。對應的,CPU“空閑”就是指其對應的可執行隊列為空,以致於CPU無事可做。

S(TASK_INTERRUPTIBLE),可中斷的睡眠狀態,可處理signal

處於這個狀態的進程因為等待某個事件的發生(比如等待socket連接、等待信號量),而被掛起。這些進程的task_struct結構被放入對應事件的等待隊列中。當這些事件發生時(由外部中斷觸發、或由其他進程觸發),對應的等待隊列中的一個或多個進程被喚醒。通過ps命令我們會看到,一般情況下,進程列表中的絕大多數進程都處於TASK_INTERRUPTIBLE狀態(除非機器的負載很高)。畢竟CPU就那麽幾個,而進程動輒幾十上百個,如果不是絕大多數進程都在睡眠,CPU又怎麽響應的過來。

D(TASK_UNINTERRUPTIBLE),不可中斷的睡眠狀態,可處理signal,有延遲

與TASK_INTERRUPTIBLE狀態類似,進程也處於睡眠狀態,但是此刻的進程是不可中斷的。不可中斷,指的並不是CPU不響應外部硬件的中斷,而是指進程不響應異步信號。絕大多數情況下,進程處在睡眠狀態時,總是應該能夠響應異步信號的。否則你將驚奇的發現,kill -9竟然殺不死一個正在睡眠的進程了!於是我們也很好理解,為什麽ps命令看到的進程幾乎不會出現TASK_UNINTERRUPTIBLE狀態,而總是TASK_INTERRUPTIBLE狀態。

而TASK_UNINTERRUPTIBLE狀態存在的意義就在於,內核的某些處理流程是不能被打斷的。如果響應異步信號,程序的執行流程中就會被插入一段用於處理異步信號的流程(這個插入流程可能只存在於內核態,也可能延伸到用戶態),於是原有的流程被中斷了。(參見《linux內核異步中斷淺析》)在進程對某些硬件進行操作時(比如進程調用read系統調用對某個設備文件進行讀操作,而read系統調用最終執行到對應設備驅動的代碼,並與對應的物理設備進行交互),可能需要使用TASK_UNINTERRUPTIBLE狀態對進程進行保護,以避免進程與設備交互的過程被打斷,造成設備陷入不可控的狀態。這種情況下的TASK_UNINTERRUPTIBLE狀態總是非常短暫的,通過ps命令基本上不可能捕捉到。

Z(TASK_DEAD-EXIT_ZOMBIE)退出狀態,進程稱為僵屍進程,不可被kill,即不相應任務信號,無法用SIGKILL殺死

向進程發送一個SIGSTOP信號,它就會因響應信號而進入TASK_STOPPED狀態(除非該進程本身處於TASK_UNINTERRUPTIBLE狀態而不響應信號)。(SIGSTOP與SIGKILL信號一樣,是非強制的。不允許用戶進程通過signal系統的系統調用重新設置對應的信號處理函數)向進程發送一個SIGCONT信號,可以讓其從TASK_STOPPED狀態恢復到TASK_RUNNING狀態。

當進程正在被跟蹤時,它處於TASK_TRACED這個特殊的狀態。“正在被跟蹤”指的是進程暫停下來,等待跟蹤它的進程對它進行操作。比如在gdb中對被跟蹤的進程下一個斷點,進程在斷點處停下來的時候就處於TASK_TRACED狀態。而在其他時候,被跟蹤的進程還是處於前面提到的那些狀態。
對於進程本身來說,TASK_STOPPED和TASK_TRACED狀態很類似,都是表示進程暫停下來。而TASK_TRACED狀態相當於在TASK_STOPPED之上多了一層保護,處於TASK_TRACED狀態的進程不能響應SIGCONT信號而被喚醒。只能等到調試進程通過ptrace系統調用執行PTRACE_CONT、PTRACE_DETACH等操作(通過ptrace系統調用的參數指定操作),或調試進程退出,被調試的進程才能恢復TASK_RUNNING狀態。

T(TASK_STOPPED or TASK_TRACED),暫停狀態或跟蹤狀態,不可處理signal,因為根本沒有時間片運行代碼

向進程發送一個SIGSTOP信號,它就會因響應信號而進入TASK_STOPPED狀態(除非該進程本身處於TASK_UNINTERRUPTIBLE狀態而不響應信號)。(SIGSTOP與SIGKILL信號一樣,是非強制的。不允許用戶進程通過signal系統的系統調用重新設置對應的信號處理函數)向進程發送一個SIGCONT信號,可以讓其從TASK_STOPPED狀態恢復到TASK_RUNNING狀態。

當進程正在被跟蹤時,它處於TASK_TRACED這個特殊的狀態。“正在被跟蹤”指的是進程暫停下來,等待跟蹤它的進程對它進行操作。比如在gdb中對被跟蹤的進程下一個斷點,進程在斷點處停下來的時候就處於TASK_TRACED狀態。而在其他時候,被跟蹤的進程還是處於前面提到的那些狀態。
對於進程本身來說,TASK_STOPPED和TASK_TRACED狀態很類似,都是表示進程暫停下來。而TASK_TRACED狀態相當於在TASK_STOPPED之上多了一層保護,處於TASK_TRACED狀態的進程不能響應SIGCONT信號而被喚醒。只能等到調試進程通過ptrace系統調用執行PTRACE_CONT、PTRACE_DETACH等操作(通過ptrace系統調用的參數指定操作),或調試進程退出,被調試的進程才能恢復TASK_RUNNING狀態。

X(TASK_DEAD-EXIT_DEAD),退出狀態,進程即將被銷毀

而進程在退出過程中也可能不會保留它的task_struct。比如這個進程是多線程程序中被detach過的進程(進程?線程?參見《linux線程淺析》)。或者父進程通過設置SIGCHLD信號的handler為SIG_IGN,顯式的忽略了SIGCHLD信號。(這是posix的規定,盡管子進程的退出信號可以被設置為SIGCHLD以外的其他信號。)此時,進程將被置於EXIT_DEAD退出狀態,這意味著接下來的代碼立即就會將該進程徹底釋放。所以EXIT_DEAD狀態是非常短暫的,幾乎不可能通過ps命令捕捉到。

進程的初始狀態

進程是通過fork系列的系統調用(fork、clone、vfork)來創建的,內核(或內核模塊)也可以通過kernel_thread函數創建內核進程。這些創建子進程的函數本質上都完成了相同的功能——將調用進程復制一份,得到子進程。(可以通過選項參數來決定各種資源是共享、還是私有。)那麽既然調用進程處於TASK_RUNNING狀態(否則,它若不是正在運行,又怎麽進行調用?),則子進程默認也處於TASK_RUNNING狀態。另外,在系統調用調用clone和內核函數kernel_thread也接受CLONE_STOPPED選項,從而將子進程的初始狀態置為 TASK_STOPPED。

進程狀態變遷

進程自創建以後,狀態可能發生一系列的變化,直到進程退出。而盡管進程狀態有好幾種,但是進程狀態的變遷卻只有兩個方向——從TASK_RUNNING狀態變為非TASK_RUNNING狀態、或者從非TASK_RUNNING狀態變為TASK_RUNNING狀態。也就是說,如果給一個TASK_INTERRUPTIBLE狀態的進程發送SIGKILL信號,這個進程將先被喚醒(進入TASK_RUNNING狀態),然後再響應SIGKILL信號而退出(變為TASK_DEAD狀態)。並不會從TASK_INTERRUPTIBLE狀態直接退出(至少發送一個SIGCHLD信號需要活著吧)。

進程從非TASK_RUNNING狀態變為TASK_RUNNING狀態,是由別的進程(也可能是中斷處理程序)執行喚醒操作來實現的。執行喚醒的進程設置被喚醒進程的狀態為TASK_RUNNING,然後將其task_struct結構加入到某個CPU的可執行隊列中。於是被喚醒的進程將有機會被調度執行。

而進程從TASK_RUNNING狀態變為非TASK_RUNNING狀態,則有兩種途徑:1、響應信號而進入TASK_STOPED狀態、或TASK_DEAD狀態;2、執行系統調用主動進入TASK_INTERRUPTIBLE狀態(如nanosleep系統調用)、或TASK_DEAD狀態(如exit系統調用);或由於執行系統調用需要的資源得不到滿足,而進入TASK_INTERRUPTIBLE狀態或TASK_UNINTERRUPTIBLE狀態(如select系統調用)。顯然,這兩種情況都只能發生在進程正在CPU上執行的情況下。

linux每日命令(34):ps命令和pstree命令