linux每日命令(34):ps命令和pstree命令
閱讀目錄(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. 其他實例
- 可以用 | 管道和 more 連接起來分頁查看
命令:
ps -aux |more
- 把所有進程顯示出來,並輸出到ps001.txt文件
命令:
ps -aux > ps001.txt
- 輸出指定的字段
命令:
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命令