站長新書 站長開講 首頁 最新文章 站長著作及審校 FreeBSD 筆記 Linux 筆記 Windows 筆記 虛擬化筆記 網管人雜誌 遊山玩水 關於本站
站長新書 VMware vSphere ICM 團購開跑了!!

邁向 RHCE 之路 (Day11) - 執行序 (Process)

前言

什麼是執行序 (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    //查詢 /proc 資料夾下其 PID 資料夾內容可發現執行指令的絕對路徑
  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

執行序狀態

當我們鍵入指令 ps aux 來查詢目前系統所執行的所有執行序 (Process) 我們可看到啟動該執行序的使用者 USER、PID 號碼、CPU 使用時間、Memory 使用時間 ...等,其中有一個欄為位 STAT 也就是 執行序狀態 (Process State),本文即為了解相關的縮寫意義。

鍵入指令 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
   ...略...

執行序狀態 (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

執行序狀態 (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

執行序狀態 (Uninterruptable sleep)

Uninterruptable sleep 不可中斷的休眠,例如 退出光碟機拖盤因為這是屬於硬體 I/O 也就是執行後就要做完即使是 root 也無法停止該動作的執行,您可嘗試當光碟機拖盤進行退出或收回時終止該動作 (相信無法使拖盤退到一半時停住吧!),在執行退出及收回光碟機拖盤時其狀態便為 D (Uninterruptable sleep)。

執行序優先權 (nice)

系統的程序執行優先權數值範圍為 -20 ~ 19 而優先權數值 -20 為最高優先權數值 19 為最低,所有程序的預設優先權數值為 0,以下為 root 及一般使用者所能使用的優先權數值及程序狀態。

root

non-root

從上面說明我們可了解只有 root 能設定優先權數值 -20 ~ 19 而一般使用者僅能設定優先權數值 0 ~ 19,至於如何改變優先權數值? 我們可利用指令 nice、renice。

執行序訊號 (kill Signals)

我們可利用指令 kill 來送訊號 (Signals) 給指定的程序,常用的訊號 (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

執行序互動管理 (top)

在指令模式下我們可利用指令 top 來即時觀察系統程序,並可透過相關熱鍵來對指定的欄位進行排序,常用熱鍵如下:

前景/背景 行程控制

當您在文字模式下執行某些指令時會 佔住 您的提示字元符號 (也就無法繼續輸入指令),此時您可將該指令丟到背景執行這樣您的前景 (也就是提示字元符號) 便可繼續輸入其它指令。

 # top &               //執行 top 並將該指令丟到背景執行
  [1] 13676
 #sh sleep.sh &        //執行 sleep.sh 並將該指令丟到背景執行
 #jobs -l              //顯示目前所有在背景執行的工作列表
  [1]+ 13676 Stopped (tty output)    top
  [2]- 13677 Running                 sh sleep.sh &

執行序樹狀結構 (pstree)

可以配合 pstree 套件來輔助我們即時了解執行序樹狀結構,例如我們查詢 sshd 的執行序樹狀結構,可以看到整個 sshd 的母程序 PID 為 1438 負責帶起子程序 PID 13504。

 #pstree -aupU | grep sshd
   ├─sshd,1438
   │   └─sshd,13504
   │           ├─grep,13662 sshd
  ...略...  
Go To Oddmuse OrgGo To FreeBSD OrgCreative Commons 2.5 Taiwansitestates.com