iT邦幫忙

DAY 11
7

邁向 RHCE 之路系列 第 11

邁向 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),本文即為了解相關的縮寫意義。
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
  ...略...

----- 執行序狀態 (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)。
eject: 退出光碟機拖盤
eject -r: 收回光碟機拖盤

----- 執行序優先權 (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: 改變已執行程序的優先權數值

----- 執行序訊號 (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

----- 執行序互動管理 (top) -----
在指令模式下我們可利用指令 top 來即時觀察系統程序,並可透過相關熱鍵來對指定的欄位進行排序,常用熱鍵如下:
P: 對 CPU 欄位進行排序
M: 對 Memory 欄位進行排序
T: 對 Time 欄位進行排序
h: 顯示幫助頁面
q: 離開

----- 前景/背景 行程控制 -----
當您在文字模式下執行某些指令時會 佔住 您的提示字元符號 (也就無法繼續輸入指令),此時您可將該指令丟到背景執行這樣您的前景 (也就是提示字元符號) 便可繼續輸入其它指令。
&: 可於執行指令時在最後面加上此符號將該指令丟到背景執行
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 &

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

#pstree -aupU | grep sshd
  ├─sshd,1438
  │   └─sshd,13504
  │           ├─grep,13662 sshd
 ...略...  

(上一篇)邁向 RHCE 之路 (Day10) - vi 編輯器及常用指令
(下一篇)邁向 RHCE 之路 (Day12) - 排程 (at、crontab、anacron)
邁向 RHCE 之路系列文章連結


上一篇
邁向 RHCE 之路 (Day10) - vi 編輯器及常用指令
下一篇
邁向 RHCE 之路 (Day12) - 排程 (at、crontab、anacron)
系列文
邁向 RHCE 之路30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言