︿
Top

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
  ...略...  
文章標籤: