阿旺的 Linux 開竅手冊-process 程序

阿旺的 Linux 開竅手冊







基礎篇
進階篇
補腦篇
版權所有,引用請註明出處

 進階篇

Advanced Chapter 6 : Process (程序)

6.0 process & jobs 簡介
6.1 job
        job_control
        前景程式
        終止程式<CTRL+C>
        暫停程式 <CTRL+Z>
        背景執行程式 &
        jobs 顯示背景程式
            管理 jobs
        bg 暫停轉背景
        fg 背景轉前景
        kill 殺死 prosess
            killall 抄家滅族
6.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(守護程序)
6.3 process 監控
        ps 顯示程序狀況
        top 程序和校能監控
        nice 調整程序優先權
            renice
6.4 named pipe(具名管線)
         mkfifo
6.5 process substitution






















process 程序

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

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

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

一千七百年前 <莊子- 齊物論>可能是世上最早實驗和記錄 process 的科學觀察,嘗試觀察人的 process。

<齊物論>說: 「子綦靠者椅子而坐.仰天吐氣後一動也不動進入〝喪我〞(無我)境界....(關掉所有的 process)
一段時間後其第子子游覺得有點不太對勁,擔心老師是不是死了?緊張的搖醒老師問老師。

『老師老師!您剛身體一動也不動像枯木死灰....』 『 ...身體可如槁木死灰但有可能沒有意念(process)嗎?今天老師〝無我〞的境界不同以往』」(道家稱心沒任何 process 境界為〝坐忘〞、〝喪我〞或〝心齋〞,佛家觀點叫〝入定〞)。

子綦的實驗觀察出人的作業系統,其 process 可分〝人籟〞、〝地籟〞和〝天籟〞。

〝人籟〞是完全可自由控制的 process(如我要不要滑手機很像 Linux 的 job control);
〝地籟〞為因緣觸發或可部分微調控制的 process ,(如我看到美女的生理反應 或 OS 的renice)經一定的練習或許可控制;
最上層 process 叫〝天籟〞 (如心跳或 OS 的daemon)則不知是誰主使的。

某些哲學認為〝天籟〞也可停止,禪定境界的〝四無色定〞,〝滅盡定〞或叫〝枯木定〞幾乎什麼 process 都停了,據說廣欽和尚常一定數月,有次鼻息全無旁人以為死了,但又不敢下定論於是請近代藝術大師李叔同來鑑定生死,李叔同看了認為這是世間少有的〝大定〞彈指三下示意廣欽才出定,當時曾轟動泉州。

人經修行是否可像動物的冬眠般幾乎所有 process 都停上而鼻息全無?我是不信怪力亂神比較認同禪宗認為〝枯木定〞毫無意義 -〝佛來佛斬,魔來魔斬〞不理不睬任何的意識(process),任由其十方來十方去不著像就是〝禪定〞。

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

操控和了解〝人籟〞(job)遠比〝地籟〞/〝天籟〞容易 ,故就先介紹 job 開始吧!


^ back on top ^





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

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





^ back on top ^





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

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


^ back on top ^





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

ps 顯示程序狀況
最常用來觀察 process 的工具應是 ps,例出配合 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

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

預設執行 top 時會一直在前景每 5 秒動態的更新即時資訊(預設最佔 CPU 資源的 process 排在最前方便找瓶頸)直到按 q 退出, top 是一互動工具可 renicekill process 等動作,更多的按鍵說明可按 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 時不可缺的好工具,前五行所提供的這些訊息如下。
第六行以下為 process 的資訊,共有 12 個欄位,各欄位意義如下:
PID process 的 PID
USER process 的使用者
PR process 的優先順序(priority)
NI process 的 nice
VIRT 〝VIER〞為 virtual image run time 的縮寫,為 process 使用 swap memory 情形(kb)
RES 〝RES〞為 resident size 的縮寫,為 process 使用的 memory 狀況(kb)
SHR 共用記憶體大小(shared memory size)(kb)
S 〝S〞為 status,即 process 狀態,可能有如下的狀態
D=不可中斷的 sleeping process 
R=正在運行的 process
S=sleeping process
T=暫停的 process
Z=zombie process
%CPU process 的 CPU 使用率
%MEM process 的 memory 使用率
TIME+ process 使用CPU 的時間總計,單位為 1/100 秒
COMMAND process 名稱

top 列出的 process 一卡車有時易失焦,可用 top -p PID 來限制列出的 process 。

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


nice 調整程序優先權
〝nice〞中文為[友好],那和 process 有什關係呢?原因為自己如越低調相對的能凸顯別人,對別入就越〝友好〞,對 process 來說低調的方法就是把 process 的優先權(priority)設的越低,別的 process 就可得到更多 CPU 使用率,因此對別的 process 越〝nice〞。

nice 可設定 process 優先權 ,優先權由高到低範圍為從 -20 到 19,也就是 nice 值越小優先權越高。只有 root 可設定負數的 nice 值,如沒特別指定,一般 nice 值=0,且父程序 nice 值會遺傳給子程序。

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

例:
$ nice ←顯示目前的 nice 值
0 ←目前 nice 值=0
$ sleep 1000 & ←製造一背景 process 觀察其 nice 值
[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 N COMMAND (N 為 nice 值,範圍 -20~ 19)但只有 root 可設小於 0 的 nice 值。

例:
$ nice -n 10 dd if=/dev/zero of=1g-image bs=1G count=1 & ←設定 dd 的 nice值=10


^ back on top ^





6.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 ^





6.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)←不管檔案的大寫或小寫比較異同

如上例如不用 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)。[註 6.5]
  2. 背景執行 diff file1 /dev/fd/63 &
  3. 執行 uniq file2 > /dev/fd/63
  4. 處理完成時刪除〝/dev/fd/63〞 的 named pipe 檔。



^ back on top ^















www.reliablecounter.com
digital mastering

[註6.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

[註6.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)