第6學時 進程
6.1 啟動一個進程
在UNIX中無論何時執行一個命令,它都建立或啟動一個新進程。
例如:當使用ls命令列一個目錄內容時,就啟動一個進程。
作業系統使用一個叫做pid或進程ID的5位元字ID來跟蹤進程。系統中每個進程都有一個唯一的pid。
pid最終可能重複是因為所有可能的數字都被用完,所以下一個pid又從頭開始。
在任何時刻,系統中沒有兩個相同的pid進程,因為pid是UNIX用來跟蹤每個進程的。
6.1.1.前台進程
預設下,使用者啟動的每個進程都在前台運行。進程從鍵盤得到輸入並把輸出送到螢幕上。
在運行命令時,不能運行其他命令(啟動任何其他進程)。這時可以輸入命令,但由於UNIX鍵盤輸入緩衝區的原因,
直到前面命令執行完後才會顯示出來。
UNIX提供一些措施來在後台啟動進程、懸掛前台進程和在前台和後台之間移動進程。
6.1.2 後台進程
一個後台進程運行時不必與鍵盤串連。如果後台進程要求鍵盤輸入,則進行等待。
在後台運行一個進程的優點是使用者可以運行其他命令,使用者不需要等待一個進程完成再啟動另一個。
啟動一個後台進程最簡單的方式是在命令的後面增加一個&符號
例如:$ ls cho*.doc &
要求輸入的後台進程
如果使用者運行一個要求輸入的後台進程,而且沒有把它重新導向為用讀檔案來代替鍵盤輸入,則進程停止。
如果使用者把進程和任務監測置為可用,則在一個空命令提示字元後按Enter或啟動一個命令時會返回一個資訊。
1.把一個前台進程移動到後台
除了使用&在後台運行一個進程外,使用者還可以把一個前台進程移動到後台。
一個前台進程運行時,Shell不處理任何新命令。使用者在輸入新命令前,必須懸掛前台進程得到一個提示符。
當前台進程被懸掛時,有一個命令提示字元可以讓使用者輸入其他命令,原來的進程仍在記憶體中,但不佔用CPU時間。
要恢複前台進程有兩個選擇---後台和前台。
bg命令使使用者能把懸掛進程置到後台;fg命令則可以把進程返回到前台。
使用CTRL+Z,停止一個進程。bg恢複一個進程。
2.把一個後台移動到前台
當有一個進程在後台或是懸掛,使用者可以使用fg命令把它移動到前他。
預設下,最後一個被懸掛或移動到背景進程將被移到前台。
3。使後台進程保持繼續運行(nohup命令)
當退出系統或串連意外中斷時,使用者可以防止一個後台進程終止。nohup命令可以防止使用者的進程受到HUP訊號,從而進程可以
只需將nohup放在運行命令的前面即可。
由於nohup被設計為無終端時運行,所以它希望使用者把輸出重新導向到一個檔案中。如果不這樣做,nohup自動重新導向到一個
叫做nohup.out中。
4.等待後台進程結束(wait命令)
在做其他事情前等待一個進程結束有兩種方法。使用者可以隔幾分鐘按一下enter,直到得到一個完成的資訊。或使用wait命令
使用wait有三種方式--無選項、使用進程ID、使用加%號首碼的任務標號
例如:$ wait %1
這時不能輸入其他命令,直到任務結束。
6.2 列出正在啟動並執行進程
使用者可以在前台或後台啟動一個進程,懸掛他們,並在前台和後台之間移動,但怎麼才能知道正在啟動並執行是哪些進程呢?
可以使用jbos或ps命令;
6.2.1 ps命令
在預設情況下,它顯示正在啟動並執行進程。它還可以接受許多不同選項。
對每個正在啟動並執行進程,它提供四條資訊:pid、TTY(進程啟動並執行終端)、進程消耗的CPU時間、以及啟動並執行命令名。
ps中-f選項是最長用的,它提供更多的資訊
資訊列表如下:
列名描述
UID進程所屬使用者ID
PID進程ID
PPID父進程ID(啟動它的進程ID)
C進程使用CPU時間
STIME進程開始時間
CMD啟動該進程的命令
6.3 殺死一個進程(kill命令)
$ kill %1
%1表示任務號
使用者可以使用進程ID而不是加%的任務標號來殺死一個特定進程。要使用進程ID來殺死進程,可以使用命令:
$ kill 6639 #(PID號)
6.4 父進程和子進程
在上面$ ps -f例子中,每個進程被賦予兩個ID:進程ID(pid)和父進程ID(ppid)。系統中的每個使用者進程都有一個父進程。
使用者啟動並執行大部分命令把Shell當作父進程。
Shell的父進程通常是作業系統或終端通訊進程。
6.4.1 任務ID和進程ID
後台進程和懸掛進程通常由任務標號操作,這個數字與進程ID不同,它是因為較短才被使用。
6.4.2 SubShells
當使用者運行Shell指令碼時,除了指令碼中的任何命令外,還建立了另一個Shell解譯器的拷貝。
新Shell被稱為一個SubShells,就像一個目錄包含在另一個目錄下時成為子目錄一樣。
例如:shell指令檔psit
#! /bin/ksh
ps -ef | grep root
exit 0
當運行時,psit的返回結果是:
$ psit
root 9830 3662 0 22:57:00 pts/6 0:00 ksh psit
root 9831 9830 0 22:57:01 pts/6 0:00 ps -ef
root 9832 9830 0 22:57:01 pts/6 0:00 grep root
root 3662 3657 0 22:57:01 pts/6 0:00 -ksh
從上看出,當運行psit此指令檔時,會產生一個父進程 ksh psit,其中執行的命令都將成為其子進程。