轉載 https://www.cnblogs.com/vamei/archive/2012/10/07/2713023.html 作者: Vamei
Linux的進程相互之間有一定的關系货岭。比如說且改,在Linux進程基礎中因苹,我們看到鸵闪,每個進程都有父進程,而所有的進程以init進程為根秒梅,形成一個樹狀結構铐伴。我們在這里講解進程組和會話,以便以更加豐富的方式了管理進程伴奥。
一、進程組 (process group)
每個進程都會屬于一個進程組(process group)翼闽,每個進程組中可以包含多個進程。進程組會有一個進程組領導進程 (process group leader)洲炊,領導進程的PID (PID見Linux進程基礎)成為進程組的ID (process group ID, PGID)感局,以識別進程組尼啡。
PID PGID PPID COMMAND
17763 17763 17751 bash
18534 18534 17763 ps
18535 18534 17763 cat
PID為進程自身的ID,PGID為進程所在的進程組的ID询微, PPID為進程的父進程ID崖瞭。從上面的結果,我們可以推測出如下關系:
圖中箭頭表示父進程通過fork和exec機制產生子進程撑毛。ps和cat都是bash的子進程书聚。進程組的領導進程的PID成為進程組ID。領導進程可以先終結藻雌。此時進程組依然存在雌续,并持有相同的PGID,直到進程組中最后一個進程終結胯杭。
我們將一些進程歸為進程組的一個重要原因是我們可以將信號發(fā)送給一個進程組驯杜。進程組中的所有進程都會收到該信號。我們會在下一部分深入討論這一點做个。
二鸽心、會話 (session)
更進一步,在shell支持工作控制(job control)的前提下居暖,多個進程組還可以構成一個會話 (session)顽频。bash(Bourne-Again shell)支持工作控制,而sh(Bourne shell)并不支持太闺。
會話是由其中的進程建立的糯景,該進程叫做會話的領導進程(session leader)。會話領導進程的PID成為識別會話的SID(session ID)跟束。會話中的每個進程組稱為一個工作(job)莺奸。會話可以有一個進程組成為會話的前臺工作(foreground),而其他的進程組是后臺工作(background)冀宴。每個會話可以連接一個控制終端(control terminal)灭贷。當控制終端有輸入輸出時,都傳遞給該會話的前臺進程組略贮。由終端產生的信號甚疟,比如CTRL+Z, CTRL+\逃延,會傳遞到前臺進程組览妖。
會話的意義在于將多個工作囊括在一個終端,并取其中的一個工作作為前臺揽祥,來直接接收該終端的輸入輸出以及終端信號讽膏。 其他工作在后臺運行。
一個命令可以通過在末尾加上&方式讓它在后臺運行:
ping localhost > log &
此時終端顯示:
[1] 10141
括號中的1
表示工作號拄丰,而10141
為PGID
我們通過如下方式查詢更加詳細的信息:
ps -o pid,pgid,ppid,sid,tty,comm
(tty表示控制終端)
信號可以通過 kill
kill -SIGTERM -10141
或者
kill -SIGTERM %1
的方式來發(fā)送給工作組府树。上面的兩個命令俐末,一個是發(fā)送給PGID(通過在PGID前面加-來表示是一個PGID而不是PID),一個是發(fā)送給工作1(%1)奄侠,兩者等價卓箫。
一個工作可以通過fg
從后臺工作變?yōu)榍芭_工作:
cat > log &
fg %1
當我們運行第一個命令后,由于工作在后臺垄潮,我們無法對命令進行輸入烹卒,直到我們將工作帶入前臺,才能向cat命令輸入弯洗。在輸入完成后旅急,按下CTRL+D來通知shell輸入結束。
進程組(工作)的概念較為簡單易懂涂召。而會話主要是針對一個終端建立的坠非。當我們打開多個終端窗口時,實際上就創(chuàng)建了多個終端會話果正。每個會話都會有自己的前臺工作和后臺工作炎码。這樣,我們就為進程增加了管理和運行的層次秋泳。在沒有圖形化界面的時代潦闲,會話允許用戶通過shell進行多層次的進程發(fā)起和管理。比如說迫皱,我可以通過shell發(fā)起多個后臺工作歉闰,而此時標準輸入輸出并不被占據,我依然可以繼續(xù)其它的工作卓起。如今和敬,圖形化界面可以幫助我們解決這一需求,但工作組和會話機制依然在Linux的許多地方應用戏阅。