1、前言
什麼是 執行序 (Process)? 簡單說即為將指令執行後載入至記憶體 (Memory) 中稱之,而所有執行序則儲存於 /proc 中,如下練習中在 GUI 環境下執行 top & 將該程序丟到背景執行,系統顯示其 PID 當然您也可使用 ps 指令來查詢,而當程序執行時可看到在 /proc 中自動建立以該 PID 命名的資料夾,若關閉該執行序則相對的在 /proc 中的資料夾便立即消失 (從記憶體中釋放)。# top & //執行 xclock 並丟到背景執行
[1] 13528 //顯示其 PID
# ps aux |grep top //使用指令 ps 也可查詢其 PID
root 13528 0.0 0.0 2464 688 pts/0 T 07:55 0:00 top
# ls -l /proc/13528 | grep top //查詢執行指令的絕對路徑
lrwxrwxrwx. 1 root root 0 Oct 17 07:56 exe -> /usr/bin/top
# ls -l /proc/13528 //關閉執行序後資料夾消失 (從記憶體中釋放)
ls: cannot access /proc/13528: No such file or directory
文章目錄
1、前言2、一般執行序狀態
3、執行序狀態 (Sleep、Run)
4、執行序狀態 (sTopped)
5、執行序狀態 (Uninterruptable sleep)
6、執行序優先權 (nice)
7、執行序訊號 (kill Signals)
8、執行序互動管理 (top)
9、前景/背景 行程控制
10、執行序樹狀結構 (pstree)
2、一般執行序狀態
當我們鍵入指令 ps aux 來查詢目前系統所執行的所有執行序 (Process) 我們可看到啟動該執行序的使用者 USER、PID 號碼、CPU 使用時間、Memory 使用時間 ...等,其中有一個欄為位 STAT 也就是 執行序狀態 (Process State),本文即為了解相關的縮寫意義。- S: Sleep (目前未執行但受到觸發後即轉變為 Run)。
- R: Run。
- T: sTopped (kill -19)。
- N: 低優先權。
- D: Uninterruptable sleep (不可中斷的休眠,例如 H/W、I/O),例如執行指令 eject 退出光碟機拖盤,這是屬於硬體 I/O 也就是執行後就要做完即使是 root 也無法停止該動作的執行 (無法時拖盤退到一半時停住吧!)。
- Z: Zombie (死掉的子行程)。
- <: 高優先權。
鍵入指令 ps aux 即可查詢目前系統上,所有 Process 及顯示所有欄位。
# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 2824 1400 ? Ss Oct07 0:01 /sbin/init
root 2 0.0 0.0 0 0 ? S Oct07 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S Oct07 0:00 [migration/0]
...略...
若您不想查看所有欄位也可指令要顯示的欄位,請鍵入如下指令:
# ps axo pid,user,cmd,stat
PID USER CMD STAT
1 root /sbin/init Ss
2 root [kthreadd] S
3 root [migration/0] S
...略...
3、執行序狀態 (Sleep、Run)
程序執行後即到此狀態,如下執行指令 sh sleep.sh & 後查看其狀態即為 Sleep,但此時程序仍未結束而是在等待中,若觸發後狀態變會轉變為 Run。# cat sleep.sh
#!/bin/sh
sleep 60
echo "Sleep 60 second!!"
# sh sleep.sh &
[1] 13598
# ps axo pid,user,cmd,stat | grep sleep
13598 root sh sleep.sh S
13599 root sleep 60 S
4、執行序狀態 (sTopped)
可利用指令 kill -19 command 來對指定的程序執行 暫停 的動作,若要解除對程序的暫停請使用指令 kill -18 command 來達成。# sh sleep.sh &
[2] 13641
# kill -19 13641
# ps axo pid,user,cmd,stat | grep sleep
13641 root sh sleep.sh T
13642 root sleep 60 S
5、執行序狀態 (Uninterruptable sleep)
Uninterruptable sleep 不可中斷的休眠,例如 退出光碟機拖盤因為這是屬於硬體 I/O 也就是執行後就要做完即使是 root 也無法停止該動作的執行,您可嘗試當光碟機拖盤進行退出或收回時終止該動作 (相信無法使拖盤退到一半時停住吧!),在執行退出及收回光碟機拖盤時其狀態便為 D (Uninterruptable sleep)。- eject: 退出光碟機拖盤。
- eject -r: 收回光碟機拖盤。
6、執行序優先權 (nice)
系統的程序執行優先權數值範圍為 -20 ~ 19 而優先權數值 -20 為最高優先權數值 19 為最低,所有程序的預設優先權數值為 0,以下為 root 及一般使用者所能使用的優先權數值及程序狀態。root
- Priority Setting: -20 ~ 19
- Process State (-20 ~ 0): <
- Process State (0 ~ 19): N
non-root
- Priority Setting: 0 ~ 19
- Process State (0 ~ 19): N
從上面說明我們可了解只有 root 能設定優先權數值 -20 ~ 19 而一般使用者僅能設定優先權數值 0 ~ 19,至於如何改變優先權數值? 我們可利用指令 nice、renice。
- nice: 指定程序的優先權數值。
- renice: 改變已執行程序的優先權數值。
7、執行序訊號 (kill Signals)
我們可利用指令 kill 來送訊號 (Signals) 給指定的程序,常用的訊號 (Signals) 如下:- -9: 強制。
- -15: 結束 (預設值)。
- -18: 解除暫停。
- -19: 暫停。
- 1: 重新讀取設定檔。
- -l: 列出所有訊號 (Signals) 數值。
# ps alx | grep -E 'udevd|rtkit-daemon' //nice 值為 -2 及 -4 狀態為 <,而值為 1 狀態為 N
5 0 455 1 16 -4 2768 1284 - S<s ? 0:00 /sbin/udevd -d
5 0 1399 455 18 -2 3424 1960 - S< ? 0:00 /sbin/udevd -d
5 0 1400 455 18 -2 3424 1920 - S< ? 0:00 /sbin/udevd -d
4 499 1803 1 21 1 25052 1172 - SNl ? 0:00 /usr/libexec/rtkit-daemon
8、執行序互動管理 (top)
在指令模式下我們可利用指令 top 來即時觀察系統程序,並可透過相關熱鍵來對指定的欄位進行排序,常用熱鍵如下:- P: 對 CPU 欄位進行排序。
- M: 對 Memory 欄位進行排序。
- T: 對 Time 欄位進行排序。
- h: 顯示幫助頁面。
- q: 離開。
9、前景/背景 行程控制
當您在文字模式下執行某些指令時會 佔住 您的提示字元符號 (也就無法繼續輸入指令),此時您可將該指令丟到背景執行這樣您的前景 (也就是提示字元符號) 便可繼續輸入其它指令。- &: 可於執行指令時在最後面加上此符號將該指令丟到背景執行。
- Ctrl + z: 可將目前在前景執行的工作執行暫停的動作。
- fg [%job number]: 指定 job number 回到前景工作。
- bg [%job number]: 指定 job number 丟到背景執行。
- kill [-SIGNAL] [%job number]: 指定 SIGNAL (ex. -19) 給 job number。
- jobs -l: 顯示所有背景執行的工作列表。
# top & //執行 top 並將該指令丟到背景執行
[1] 13676
# sh sleep.sh & //執行 sleep.sh 並將該指令丟到背景執行
# jobs -l //顯示目前所有在背景執行的工作列表
[1]+ 13676 Stopped (tty output) top
[2]- 13677 Running sh sleep.sh &
10、執行序樹狀結構 (pstree)
可以配合 pstree 套件來輔助我們即時了解執行序樹狀結構,例如我們查詢 sshd 的執行序樹狀結構,可以看到整個 sshd 的母程序 PID 為 1438 負責帶起子程序 PID 13504。# pstree -aupU | grep sshd
├─sshd,1438
│ └─sshd,13504
│ ├─grep,13662 sshd
...略...