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