作者:Vamei 出處:http://www.cnblogs.com/vamei 歡迎轉載,也請保留這段聲明。謝謝!
Linux的程序互相之間有一定的關系。比如說,在Linux程序基礎中,我們看到,每個程序都有父程序,而所有的程序以init程序為根,形成一個樹狀結構。我們在這裡講解程序組和會話,以便以更加豐富的方式了管理程序。
程序組 (process group)
每個程序都會屬于一個程序組(process group),每個程序組中可以包含多個程序。程序組會有一個程序組上司程序 (process group leader),上司程序的PID (PID見Linux程序基礎)成為程序組的ID (process group ID, PGID),以識别程序組。
$ps -o pid,pgid,ppid,comm | cat
PID PGID PPID COMMAND
bash
ps
cat
PID為程序自身的ID,PGID為程序所在的程序組的ID, PPID為程序的父程序ID。從上面的結果,我們可以推測出如下關系:
圖中箭頭表示父程序通過fork和exec機制産生子程序。ps和cat都是bash的子程序。程序組的上司程序的PID成為程序組ID。上司程序可以先終結。此時程序組依然存在,并持有相同的PGID,直到程序組中最後一個程序終結。
我們将一些程序歸為程序組的一個重要原因是我們可以将信号發送給一個程序組。程序組中的所有程序都會收到該信号。我們會在下一部分深入讨論這一點。
會話 (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+\,會傳遞到前台程序組。
會話的意義在于将多個工作囊括在一個終端,并取其中的一個工作作為前台,來直接接收該終端的輸入輸出以及終端信号。 其他工作在背景運作。
一個指令可以通過在末尾加上&方式讓它在背景運作:
#就是上面說的背景job
$ping localhost > log &
此時終端顯示:
[]
括号中的1表示工作号,而10141為PGID
我們通過如下方式查詢更加詳細的資訊:
$ps -o pid,pgid,ppid,sid,tty,comm
//(tty表示控制終端)
信号可以通過kill
//我們常用的kill -9 xxx 就是信号的具體實作例子
$kill -SIGTERM -
或者
$kill -SIGTERM %1
的方式來發送給工作組。上面的兩個指令,一個是發送給PGID(通過在PGID前面加-來表示是一個PGID而不是PID),一個是發送給工作1(%1),兩者等價。
一個工作可以通過$fg從背景工作變為前台工作:
$cat > log &
$fg %1
當我們運作第一個指令後,由于工作在背景,我們無法對指令進行輸入,直到我們将工作帶入前台,才能向cat指令輸入。在輸入完成後,按下CTRL+D來通知shell輸入結束。
程序組(工作)的概念較為簡單易懂。而會話主要是針對一個終端建立的。當我們打開多個終端視窗時,實際上就建立了多個終端會話。每個會話都會有自己的前台工作和背景工作。這樣,我們就為程序增加了管理和運作的層次。在沒有圖形化界面的時代,會話允許使用者通過shell進行多層次的程序發起和管理。比如說,我可以通過shell發起多個背景工作,而此時标準輸入輸出并不被占據,我依然可以繼續其它的工作。如今,圖形化界面可以幫助我們解決這一需求,但工作組和會話機制依然在Linux的許多地方應用。
總結
process group, pgid
session, sid, job, forground, background
fg, kill -pid, &, %