home products tech support contact us

 Linux 技術支援    ⇒   基礎篇    進階篇    補腦篇    指令索引    中⇒ENG
版權所有, 引用請註明出處

 Process (進程)

1.0 process & jobs 簡介
1.1 job
        job_control
        前景程式
        終止程式<CTRL+C>
        暫停程式 <CTRL+Z>
        背景執行程式 &
        jobs 顯示背景程式
            管理 jobs
        bg 暫停轉背景
        fg 背景轉前景
        kill 殺死 prosess
            killall 抄家滅族
1.2 process (進程)
        PID (進程 ID)
        父進程和 PPID
        子進程
            pstree 顯示 process 關係樹
        process group & pgid (進程群組和進程群組 ID)
            process group leader (進程群組領導)
        session 和 session id (SID)
            session leader
        init 始祖 process
        殭屍進程(zombie process)
        fork 和 exec
            exec
        daemon(守護進程)
1.3 process 監控
        ps 顯示進程狀況
        top 進程和校能監控
        nice 調整進程優先權
            renice
1.4 named pipe(具名管線)
         mkfifo
1.5 process substitution


1.0 Process & Job 簡介
平常我們的思考是多工的,但許多的工作你我卻不一定查覺得到,例如我時常邊走路邊聽音樂和邊滑手機有三個工作在執行。表面上我可自由意識的控制所有的工作,例如過馬路時會暫停滑手機,但對面忽然走來短裙辣妹我生理本能反應如激凸心跳的加速或呼吸急促等不是我能控制的,如定力夠或許能仰制部份反應,但還是有一些背景工作我完全無法控制,如胃的消化蠕動,血液的循環等。

目前主流的作業系統和人一樣有多工(Muti-Task)能力 ,同一時間可執行很多的應用程式,每一個執行中程式就是一個〝 process〞(〝程序〞或叫〝行程〞或〝進程〞),作業系統也和人一樣有些 process 可自由控制或部分控制,也有完全不可控制的 process。

Linux 和人的的思緒一樣,process 没有一刻停止過,無時無刻都有大大小小的 process 在跑。多工的作業系統(如 Linux/Windows)運行時,理論上 process 不能完全關掉, 無時無刻都有 process 在執行。

一般的定義為任何運行中(還未結束)的程式,包含系統程式(daemon)或使用者所下的指令都算 process,而使用者在登入的 sehll 內所下的指令所產生的 process 叫〝job〞。而除非是關機或 Suspend to RAM 的休眠狀態 ,process 不可能完全停止的。

^ back on top ^



1.1 Job
使用者在登入的 sehll 內所下的指令所產生的 process 叫〝job〞。

以大家熟悉的 Windows 來舉例,下圖為在 Windows 的文字界面下輸入 taskmgr 執行〝工作管理員〞(Task Manager)在〝應用程式〞(Apps) 欄就會列出使用者的 jobs 。

windows Task Manager



^ back on top ^



1.2 process(進程)
Unix/Linux 運行時,任何還在執行中會佔資源的程式,包含使用者的 job 或系統程式 daemon 都是 process。〝process〞中文有人譯為〝程序〞也有人叫〝行程〞或〝進程〞,但為必免失真我傾向直接用原文的〝process〞。

因 Unix-Like 的系統為多人多工,所以比 job 複雜些,也有一些和 process 有關的專有名詞要先了解。


^ back on top ^


1.3 process 監控
Linux 提供許多方便的工具可觀察運行中的 process,常用的有 pstop

ps 顯示進程狀況
ps 常用來觀察 process ,例如配合 kill 來殺死 process。但 ps 為了相容一堆 Unix-like 故選項多且雜,且選項中有些需〝-〞有些不用很易搞亂,例如 ps -auxps aux 不完全相等,因選項太多了,如下只列出 Linux 常用的用法。

語法:ps [option][-option]
指令名稱/功能/命令使用者 選項 功能
ps/
(process status)顯示進程狀況/
Any
-a 列出所有 tty 但排除 session leader 和終端機的 process
a 列出所有 tty (終端機) 的 jobs,和選項〝x〞一起使用會列出所有 process (包含daemon)
-A 列出所有 process,類似 ps ax 但沒 〝STAT〞欄
-f 類似選項〝-a〞但多了〝UID〞,〝STIME〞等欄位
f 類似 pstree 但只顯示登入者同一 session id 的 process
o FORMAT 指定要顯示的欄位,常用的有〝pid〞、〝ppid〞、〝pgid〞、〝sid、〝tty〞、〝time〞 、〝nice〞、〝comm〞等
-t [N] 指定 tty (〝N〞為數字)的 process
-u [USER] 指定使用者的 process
-x 類似選項〝a〞但只顯示使有者 tty 的 process,時常和選項〝a〞一起使用會列出所有 process

ps 如沒任何選項輸出和 jobs 很像只例出登入者同一 SID 的 process。

例:
$ ps
PID TTY          TIME CMD
3627 pts/0    00:00:00 bash
3656 pts/0    00:00:00 vim
3657 pts/0    00:00:00 ps

ps aux 會顯示所有的 process 為很常見的用法,如下例來找出殭屍進程(zombie process)。

例:
$ ps aux | grep 'Z'
USER    PID %CPU %MEM    VSZ  RSS TTY    STAT START   TIME COMMAND
chi    3458  0.0  0.0      0    0 ?      Z    00:46   0:00 [xinitrc] <defunct>
chi    3459  0.0  0.0      0    0 ?      Z    00:46   0:00 [xinitrc] <defunct>
chi    3691  0.0  0.0      0    0 pts/0  Z    00:59   0:00 [myprog] <defunct>

上例中如〝STAT〞為〝Z〞就是zombie process (defunct)。

ps -o 也很有用,可指定想要輸出的格式欄位。

例:
$ ps -o pid,ppid,pgid,nice,tty,comm
PID  PPID  PGID  NI TT       COMMAND
3627  3624  3627   0 pts/0    bash
3656  3627  3656   0 pts/0    vim
3727  3627  3727   0 pts/0    ps

其他常用的用法如下:
$ ps -t 1 ←顯示 tty1 的 process
$ ps f -u obama ←顯示使用者〝obama〞 的 process tree

^ back on top ^

top 進程和校能監控
top 為Linux下常用的 process 和效能監控工具,類似 Windows 的工作管理員(Task Manager)能夠即時顯示系統中各 process 資源使用情形。

預設執行 top 時會一直在前景每 5 秒動態的更新即時資訊(預設最佔 CPU 資源的 process 排在最前方便找瓶頸)直到按 q 退出, top 是一互動工具按 rkrenice / kill process、按 t 顯示/關閉 task/cpu 資訊、按下 m 顯示/關閉 memory 資訊等動作,更多的按鍵說明可按 h

例:
$ top
top - 00:42:30 up 36 days, 1:08,  2 users,  load average: 0.16, 0.02, 0.01
Tasks: 130 total,   4 running, 125 sleeping,   1 stopped,   0 zombie
Cpu(s):  0.2%us,  2.6%sy,  0.0%ni, 97.2%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:    515156k total,   438756k used,    76400k free,    11520k buffers
Swap:  1020088k total,        0k used,  1020088k free,   253064k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND             
 2295 root      20   0 32496  12m 5936 S  1.2  2.4   0:15.29 X
 2571 aaa       20   0 64484  19m  10m S  0.9  3.9   0:04.20 gnome-terminal
 2113 root      20   0  3388 1148 1012 S  0.2  0.2   0:00.20 hald-addon-inpu
 2414 aaa       20   0 31500 3616 2940 S  0.2  0.7   0:01.01 exe
以下略

執行 top 時除了會列出 process 資訊外前五行同時提供系統運行的時間/Memroy /CPU 使用率等資訊是校調 Linux 時不可缺的好工具,前五行所提供的這些訊息如下。

例:
$ top -p 61,162 ←只例出 PID=61 & 162 的 process

常用選項有〝-b〞batch 模式(不會互動)、〝-d〞刷新時間(單位為秒)、〝-n〞刷新次數、〝-o〞排序(如 cpu 或 ram 使用率)。

例:
$ top -b -o +%CPU | head ←例出前 3 個最佔 CPU 資源的進程
$ top -b -o +%MEM | head 17 > file ←例出前 10 個最佔 memory 資源的進程存入〝file〞

更詳細的 top 操作可參考連結

^ back on top ^

nice 調整進程優先權
〝nice〞中文為[友好],那和 process 有什關係呢?原因為自己如把 process 的優先權(priority)設低,別的 process 相對就可得到更多 CPU 使用率,因此對別的 process 越〝nice〞。
nice 可設定 process 優先權(niceness value) 範圍從 -20 到 19, 值越小優先權越高。只有 root 可設定負數的值,如沒特別用 nice 指定優先權,其值為=0,且父進程優先權會遺傳給子進程。

nice 後面如沒有任何選項會顯示目前的先權值,pstop 可觀察 process 的 nice 值。

例:
$ nice ←顯示目前的優先權值
0 ←目前=0
$ sleep 1000 & ←製造一背景 process 觀察其優先權值
[1] 2733
$ ps -o pid,ni,comm ←用 ps 察看 nice 值
PID NI COMMAND ←〝NI〞為 nice 優先權值
2578 0 bash
2632 0 sleep
2634 0 ps

要設定 process 的 nice 值語法為 nice -n # COMMAND (# 為優先權值,範圍 -20~ 19)但只有 root 可設小於 0 的值。

例:
$ seq 90000000000 > /dev/null & ← 在背景跑二個默數恆河沙數的進程
$ seq 90000000000 > /dev/null &
$ time tar -Jcvf file.txz /etc &> /dev/null ← 在背景執行打包 tarball 並測量執行時間

real 0m27.590s ← 花了 27.59 秒
user 0m21.163s
sys 0m0.187s
$ time nice -n 5 tar -Jcvf file.txz /etc &> /dev/null ←將 nice 調成 5 再測一下所執行時間

real 1m24.405s ← 花了 1 分 24 秒
user 0m21.529s
sys 0m0.211s

上例實驗將 nice 值提高(優先權降低)所花的時間就越長,但相對分給別的進程的時間就越多(上例中的 seq 90000000000 ,可加速完成其動作) 。



^ back on top ^


1.4 named pipe(具名管線)
process 之間的溝通除了可透過 Signal 作簡單的溝通外, 更複雜的資料傳遞可用〝 named pipe〞 (具名管線), process 使用 named pipe 來溝通的好處是不用經其他的媒體(如磁碟)就可傳遞資訊,不但速度快又可節省磁碟空間。

mkfifo
named pipe 就如其名〝pipe〞 (水管)資料是先進先出的傳送故其行為又叫〝FIFO〞(First In First Out)。FIFO 可想像是一連串的資料流,利用資料流來溝通 process。

故製作一 FIFO 資料形態的指令就叫 mkfifo(Make FIFO)。

例:
$ mkfifo MyPipe ←製作一 named pipe 資料形態檔〝MyPipe〞
$ ls -l MyPipe ←用 ls 驗證看看
prw-rw-r-- 1 aaa aaa 0 2015-03-20 15:23 MyPipe ←最前面那個〝p〞就是 named pipe
$ file MyPipe ←用 file 驗證看看
MyPipe: fifo (named pipe)

上面我們已製作了一個 FIFO 的資料形態,因 UXIN 最重要的哲學是〝 一切都是檔案〞,故 FIFO 的資料形態也被視為檔案,但注意觀察 FIFO ( named pipe) 的檔案其大小永遠是 0,不佔實體的磁碟空間。

但這 FIFO〝 檔〞 要如何應用呢?,下面為一簡單的例子,利用這個 FIFO 檔來將數字轉為字母的溝通媒介。

例:(續上例)
$ tr '0-9' 'a-j' < MyPipe > out.txt &
[1] 3031
$ seq 0 10 > MyPipe
[1]+  Done                    tr '0-9' 'a-j' < MyPipe > out.txt
$ cat out.txt ←驗證看輸出檔〝out.txt〞是否已轉為字母
a
b
c
d
e
以下略

上例示範了不同 process 間的溝通是透過 FIFO 的資料流,完全不用經其他的媒介。

實用的範例如下例,用 named pipe 來傳遞壓縮資料的媒介:

例:(續上例)
$ bzip2 -c < MyPipe > out.bz2 &
[1] 3088
$ seq 1 1000 > MyPipe
$ bzcat out.bz2 ←讀取壓縮檔驗證看看
1
2
3
以下略

named pipe 和一般的檔案操作是沒什區別的,可用 rm 來刪除。

例:(續上例)
$ rm MyPipe

mkfifo 也可一併設定 named pipe 檔的 permission,如下例。

例:
$ mkfifo --mode=0666 /tmp/name_pipe



^ back on top ^


1.5 process substitution
〝 process substitution〞為利用不同 process 間的輸出/輸入當〝檔案〞來對待,例如指令 diff FILE1 FILE2 為比較二個檔案的異同,但如要比較是某指令的運算結果 diff 就無能為力,此時可用 process substitution 把 process 的輸出當成檔案來處理。

把 process 的輸出當〝檔案〞來對待的用法為〝< (COMMAND)〞,特別注意〝<(〞中間不能有空格。

看範例比較易懂,下例為把兩個檔案內容全轉為大寫來比較異同。

例:
$ diff <(tr a-z A-Z < file1) <(tr a-z A-Z < file2) ←比較〝file1〞&〝file2〞這二個檔案的異同&不管大小寫

如上例如不用 process substitution 至少要如下三道指令。
$ cat file1 | tr a-z A-Z > file1.tmp
$ cat file2 | tr a-z A-Z | diff - file1.tmp
$ rm file1.tmp

實際上 process substitution 也就是語法中的〝< (COMMAND)〞是在背後偷偷的用named pipe 來達到溝通不同 process 的功能。

例:
$ ls -gGl <(echo)
lr-x------ 1 64 2015-04-10 22:54 /dev/fd/63 -> pipe:[15358]
$ file <(true)
/dev/fd/63: broken symbolic link to `pipe:[15478]'


上面的實驗可知〝< (COMMAND)〞會產生一個〝/dev/fd/63〞的 named pipe。( 檔案〝/dev/fd/63〞為 File Descriptor)

為了說明,舉更精簡一點的範例來說明。

例:
$ diff file1 <(uniq file2)

上例中會分解為四個動:
  1. 建立一〝/dev/fd/63〞的具名管線 (named pipe)。[註 1.5]
  2. 背景執行 diff file1 /dev/fd/63 &
  3. 執行 uniq file2 > /dev/fd/63
  4. 處理完成時刪除〝/dev/fd/63〞 的 named pipe 檔。

^ back on top ^





[註1.3]:參考來源:http://unix.stackexchange.com/questions/18918/in-linux-top-command-what-are-us-sy-ni-id-wa-hi-si-and-st-for-cpu-usage

[註1.5]:參考來源:Advanced Bash-Scripting Guide: http://tldp.org/LDP/abs/html/process-sub.html#FTN.AEN18244
&
wikipedia
: http://en.wikipedia.org/wiki/True_and_false_(commands)