Unix系統中的進程指的是一個具有特定功能的程序,它可以和其他程序共享對某個數據集合的操作。進程被應用程序創建之後,在獲得資源時運行。如果得不到資源,就暫時停止直到獲得其所需要的資源。進程完成後消忙。故進程與普通程序仍然有所差別。因為進程是動態的,而程序是靜態的概念。不過筆者覺得這些描述都不怎麼直觀。筆者平時在跟大家交流過程中,都把Unxi進程比喻為系統的守護神。他負責與系統CPU之間進行通信並保障系統的正常運行。
雖然進程是應用軟件自動產生的。但是系統工程師在必要的時候仍然要學會對系統進程進行調整。如把某些運行時間比較久的進程放入到後台運行等等。筆者這裡就進程管理這個話題,跟大家分享一下自己在這方面的管理經驗。
一、如何查看進程標識?
進程創建之後,系統就會為其分配一個唯一的標識。進程表示的允許范圍是從0到65535的十進制數字。通常情況下,進程標識是循環使用的。如果進程標識達到上界的話,將重新使用比較小的進程號。進程號在系統中的分配原則是必須唯一。所以即使是同一個應用程序發起的進程,發起時間不同其進程號也不同。但是關於進程的很多操作,都是針對進程號來進行的。如要把後台的進程調到前台來或者人工殺死一個不用的進程,都需要知道進程標識。故在進程管理中,系統工程師首先要掌握的一個內容就是如何查看系統的進程號。
在Unix系統中,可以使用ps –ef命令來查看系統中的所有進程。輸入這個命令後,系統會顯示當前系統中進程的詳細信息。具體來說,會包括如下內容。如UID表示這個進程的所有者;PID表示進程的標識;PPID表示父進程的標識;TTY表示運行進程的終端;COMMMAND表示創建進程的系統命令。
作為一個合格的Unix系統工程師,要能夠從這些信息中得到以下有用的結論。
一是子進程與父進程的關系。每個進程都只有一個父進程,但是可以有多個子進程。創建其他進程的進程被稱為父進程;而這個被創建的進程就是子進程。為什麼要區分父子進程呢?如現在系統有三個進程,進程號分別為1001,1002,1003。而進程1003是有進程1001創建的。也就是說進程 1001是進程1003所創建的。此時如果由於某種原因手工殺死父進程1001的話,那麼它的子進程也會被同時殺死或者說成為“孤兒進程”。為此系統工程師在手工殺死進程的時候,需要先判斷一下這個進程是否還創建了其他子進程。只有在確定這些子進程的手工關閉不會對系統產生不利影響之後,系統工程師才能夠殺死父進程。而父進程與子進程的明顯區別就在於進程標示號(PID)與父進程標識號(PPID)。如果子進程創建成功,則系統fork進程會將子進程的 PID傳給父進程。故系統工程師要能夠根據進程標識號與父進程標識號來判斷誰是誰的父進程;在手工關閉父進程時要注意其創建的子進程對系統是否會產生不利影響。
二是系統創建的進程不能夠被手工關閉。在Unix系統啟動的時候,系統核心將創建sched進程。然後這個進程又會產生三個子進程,分別為 init進程、vhard進程和bdflush進程。這個四個進程的進程標示好分別為0、1、2、3。在核心調度程序為他們分配CPU時間之前,shced把其他程序調度內存。這裡Unix系統工程師需要注意的是,不要去嘗試著維護這四個進程,如不要想把這個四個進程強制關閉掉。否則的話,工程師會吃不了兜著走。
二、把前台進程移動到後台去進行。
有時候出於某些特定的需要,系統工程師可能要把某些在前台運行的進程放入到後台去運行。一個比較感性的例子,就如殺毒軟件。全盤殺毒需要比較長的時間。若哪個殺毒的窗口老是用戶眼前晃的話,讓人很不舒服。為此系統工程師就需要考慮把這個前台正在運行的進程放入到後台運行。在Unix系統中,這個功能經常用到。如工程師可能讓系統每天在一個固定的時刻對Home用戶文件夾進行備份。為了避免對用戶的干擾,可以把這個備份進程放在後台執行。故 Unix系統工程師要掌握把前台進程放入到後台執行、把後台作業調入到前台等等相關操作,並能夠排除由此產生的一些錯誤。這也是Unix高級工程師考試時的必備考點之一。
1、如何把前台作業移動到後台?
如果為了在運行進程時可以進行其他工作,工程師可以讓某個進程在後台執行。注意如果把進程放入到後台運行,則系統當前運行的shell會給這個進程分配一個作業號。注意,由於作業號不是操作系統分配的,而是shell分配的,故它只代表了後台運行的活動進程。最要命的是,它在操作系統中並不是唯一的。
若要把一個正在執行的進程放入到後台,則首先需要把正在執行的進程掛起。系統工程師若要把正在執行的進程掛起的話,可以采用掛起鍵。工程師可以在進程執行過程中,暫停他的執行過過程,並在以後繼續執行。這個操作在Unix中叫做掛起。通稱情況下,系統工程師之能夠掛起一個當前shell下的作業 (不過這對系統工程師來說已經足夠了)。掛起作業的方法主要有兩種,一是按CTRL+Z鍵,二是按系統當前定義的掛起建。把進程掛起後再使用bg命令把掛起的進程放入到後台運行。這個命令的格式為,bg % 進程標示號或者作業號、命令名等等。筆者這裡建議是采用進程的標識號,而不是作業號。因為作業號在系統中並不唯一。故可能會引發一些誤操作。
2、如何把後台作業移動到前台?
有時候管理員需要把後台進程移動到前台。如系統工程師發現後台進程遲遲沒有完成,懷疑這個進程有問題,需要手工關閉它。通常情況下,系統工程師是無法強制關閉後台進程的。若要關閉後台進程,必須先把後台進程移動到前台,然後再用關閉進程命令關閉。也就是說,為了中斷一個後台作業,可以先把它移動到前台,然後再使用前台中的中斷控制進程指令來實現。
把後台進程作業移動到前台的命令是fg,後接%標志,然後指名進程標識號或者命名命名、作業號等等。在執行這個命令的時候,筆者說明兩點。一是把後台作業移動到前台與把前台作業移動到後台有一個顯著的區別。就是把後台作移動到前台不用把後台正在執行的進程移動到前台。換句話說,在後台執行的進程系統工程師無法進行干預。即無法殺死進程,也無法掛起進程。除非等著進程自動執行完畢,否則的話工程師對於後台的進程無能為力。二是由於作業號在系統中不唯一,故利用作業號來管理後台進程並不是很好的方法。如現在恰巧有兩個作業號相同的後台進程,那麼當工程師要把某個作業號的進程掉到前台運行的時候,系統就不知道到底要調哪一個了。故筆者是建議大家通過唯一的進程標識號來管理後台進程。
3、如何查看正在運行的作業?
當系統工程師發現把進程放入後台後遲遲沒有反應,就會擔心是否哪裡出了問題,就需要查看當前進程的工作狀態。此時系統工程師可以通過jobs命令顯示當前進程的工作狀態。通常情況下,顯示進程的狀態主要為運行、中斷、等待輸入或者停止。如果進程的狀態為後面三種,則系統工程師就要把它們調入到前台,來分析進程遇到的問題。