Linux是一個多任務(wù)的作系統(tǒng),系統(tǒng)上同時運行著多個進(jìn)程,正在執(zhí)行的一個或多個相關(guān)進(jìn)程稱為一個作業(yè)。使用作業(yè)控制,用戶可以同時運行多個作業(yè),并在需要時在作業(yè)之間進(jìn)行切換。本章詳細(xì)介紹進(jìn)程管理及作業(yè)控制的命令,包括啟動進(jìn)程、查看進(jìn)程、調(diào)度作業(yè)的命令。
進(jìn)程及作業(yè)的概念
Linux是一個多用戶多任務(wù)的作系統(tǒng)。多用戶是指多個用戶可以在同一時間使用計算機系統(tǒng);多任務(wù)是指Linux可以同時執(zhí)行幾個任務(wù),它可以在還未執(zhí)行完一個任務(wù)時又執(zhí)行另一項任務(wù)。
作系統(tǒng)管理多個用戶的請求和多個任務(wù)。大多數(shù)系統(tǒng)都只有一個CPU和一個主存,但一個系統(tǒng)可能有多個二級存儲磁盤和多個輸入/輸出設(shè)備。作系統(tǒng)管理這些資源并在多個用戶間共享資源,當(dāng)您提出一個請求時,給您造成一種假象,好象系統(tǒng)只被您獨自占用。而實際上作系統(tǒng)監(jiān)控著一個等待執(zhí)行的任務(wù)隊列,這些任務(wù)包括用戶作業(yè)、作系統(tǒng)任務(wù)、郵件和打印作業(yè)等。作系統(tǒng)根據(jù)每個任務(wù)的優(yōu)先級為每個任務(wù)分配合適的時間片,每個時間片大約都有零點幾秒,雖然看起來很短,但實際上已經(jīng)足夠計算機完成成千上萬的指令集。每個任務(wù)都會被系統(tǒng)運行一段時間,然后掛起,系統(tǒng)轉(zhuǎn)而處理其他任務(wù);過一段時間以后再回來處理這個任務(wù),直到某個任務(wù)完成,從任務(wù)隊列中去除。
Linux系統(tǒng)上所有運行的東西都可以稱之為一個進(jìn)程。每個用戶任務(wù)、每個系統(tǒng)管理守護(hù)進(jìn)程,都可以稱之為進(jìn)程。Linux用分時管理方法使所有的任務(wù)共同分享系統(tǒng)資源。我們討論進(jìn)程的時候,不會去關(guān)心這些進(jìn)程究竟是如何分配的,或者是內(nèi)核如何管理分配時間片的,我們所關(guān)心的是如何去控制這些進(jìn)程,讓它們能夠很好地為用戶服務(wù)。
進(jìn)程的一個比較正式的定義是:在自身的虛擬地址空間運行的一個單獨的程序。進(jìn)程與程序是有區(qū)別的,進(jìn)程不是程序,雖然它由程序產(chǎn)生。程序只是一個靜態(tài)的指令集合,不占系統(tǒng)的運行資源;而進(jìn)程是一個隨時都可能發(fā)生變化的、動態(tài)的、使用系統(tǒng)運行資源的程序。而且一個程序可以啟動多個進(jìn)程。
Linux作系統(tǒng)包括三種不同類型的進(jìn)程,每種進(jìn)程都有自己的特點和屬性。
*
交互進(jìn)程??由一個shell啟動的進(jìn)程。交互進(jìn)程既可以在前臺運行,也可以在后臺運行。
*
批處理進(jìn)程??這種進(jìn)程和終端沒有聯(lián)系,是一個進(jìn)程序列。
*
監(jiān)控進(jìn)程(也稱守護(hù)進(jìn)程)??Linux系統(tǒng)啟動時啟動的進(jìn)程,并在后臺運行。
上述三種進(jìn)程各有各的作用,使用場合也有所不同。
進(jìn)程和作業(yè)的概念也有區(qū)別。一個正在執(zhí)行的進(jìn)程稱為一個作業(yè),而且作業(yè)可以包含一個或多個進(jìn)程,尤其是當(dāng)使用了管道和重定向命令。例如“nroff -man ps.1|grep kill|more”這個作業(yè)就同時啟動了三個進(jìn)程。
作業(yè)控制指的是控制正在運行的進(jìn)程的行為。比如,用戶可以掛起一個進(jìn)程,等一會兒再繼續(xù)執(zhí)行該進(jìn)程。shell將記錄所有啟動的進(jìn)程情況,在每個進(jìn)程過程中,用戶可以任意地掛起進(jìn)程或重新啟動進(jìn)程。作業(yè)控制是許多shell(包括bash和tcsh)的一個特性,使用戶能在多個獨立作業(yè)間進(jìn)行切換。
一般而言,進(jìn)程與作業(yè)控制相關(guān)聯(lián)時,才被稱為作業(yè)。
在大多數(shù)情況下,用戶在同一時間只運行一個作業(yè),即它們最后向shell鍵入的命令。但是使用作業(yè)控制,用戶可以同時運行多個作業(yè),并在需要時在這些作業(yè)間進(jìn)行切換。這會有什么用途呢?例如,當(dāng)用戶編輯一個文本文件,并需要中止編輯做其他事情時,利用作業(yè)控制,用戶可以讓編輯器暫時掛起,返回shell提示符開始做其他的事情。其他事情鉆以后,用戶可以重新啟動掛起的編輯器,返回到剛才中止的地方,就象用戶從來沒有離開編輯器一樣。這只是一個例子,作業(yè)控制還有許多其他實際的用途。
啟動進(jìn)程
鍵入需要運行的程序的程序名,執(zhí)行一個程序,其實也就是啟動了一個進(jìn)程。在Linux系統(tǒng)中每個進(jìn)程都具有一個進(jìn)程號,用于系統(tǒng)識別和調(diào)度進(jìn)程。啟動一個進(jìn)程有兩個主要途徑:手工啟動和調(diào)度啟動,后者是事先進(jìn)行設(shè)置,根據(jù)用戶要求自行啟動。
手工啟動
由用戶輸入命令,直接啟動一個進(jìn)程便是手工啟動進(jìn)程。但手工啟動進(jìn)程又可以分為很多種,根據(jù)啟動的進(jìn)程類型不同、性質(zhì)不同,實際結(jié)果也不一樣,下面分別介紹。
1. 前臺啟動
這或許是手工啟動一個進(jìn)程的最常用的方式。一般地,用戶鍵入一個命令“l(fā)s ?l”,這就已經(jīng)啟動了一個進(jìn)程,而且是一個前臺的進(jìn)程。這時候系統(tǒng)其實已經(jīng)處于一個多進(jìn)程狀態(tài)。或許有些用戶會疑惑:我只啟動了一個進(jìn)程而已。但實際上有許多運行在后臺的、系統(tǒng)啟動時就已經(jīng)自動啟動的進(jìn)程正在悄悄運行著。還有的用戶在鍵入“l(fā)s ?l”命令以后趕緊使用“ps ?x”查看,卻沒有看到ls進(jìn)程,也覺得很奇怪。其實這是因為ls這個進(jìn)程結(jié)束太快,使用ps查看時該進(jìn)程已經(jīng)執(zhí)行結(jié)束了。如果啟動一個比較耗時的進(jìn)程:
find / -name fox.jpg
然后再把該進(jìn)程掛起,使用ps查看,就會看到一個find進(jìn)程在里面。
2. 后臺啟動
直接從后臺手工啟動一個進(jìn)程用得比較少一些,除非是該進(jìn)程甚為耗時,且用戶也不急著需要結(jié)果的時候。假設(shè)用戶要啟動一個需要長時間運行的格式化文本文件的進(jìn)程。為了不使整個shell在格式化過程中都處于“癱瘓”狀態(tài),從后臺啟動這個進(jìn)程是明智的選擇。
[例1]
$ troff ?me notes > note_form &
[1] 4513
$
由上例可見,從后臺啟動進(jìn)程其實就是在命令結(jié)尾加上一個&號。鍵入命令以后,出現(xiàn)一個數(shù)字,這個數(shù)字就是該進(jìn)程的編號,也稱為PID,然后就出現(xiàn)了提示符。用戶可以繼續(xù)其他工作。
上面介紹了前、后臺啟動的兩種情況。實際上這兩種啟動方式有個共同的特點,就是新進(jìn)程都是由當(dāng)前shell這個進(jìn)程產(chǎn)生的。也就是說,是shell創(chuàng)建了新進(jìn)程,于是就稱這種關(guān)系為進(jìn)程間的父子關(guān)系。這里shell是父進(jìn)程,而新進(jìn)程是子進(jìn)程。一個父進(jìn)程可以有多個子進(jìn)程,一般地,子進(jìn)程結(jié)束后才能繼續(xù)父進(jìn)程;當(dāng)然如果是從后臺啟動,那就不用等待子進(jìn)程結(jié)束了。
一種比較特殊的情況是在使用管道符的時候。例如:
nroff -man ps.1|grep kill|more
這時候?qū)嶋H上是同時啟動了三個進(jìn)程。請注意是同時啟動的,所有放在管道兩邊的進(jìn)程都將被同時啟動,它們都是當(dāng)前shell的子程序,互相之間可以稱為兄弟進(jìn)程。
以上介紹的是手工啟動進(jìn)程的一些內(nèi)容,作為一名系統(tǒng)管理員,很多時候都需要把事情安排好以后讓其自動運行。因為管理員不是機器,也有離開的時候,所以有些必須要做的工作而恰好管理員不能親自作,這時候就需要使用調(diào)度啟動進(jìn)程了。
調(diào)度啟動
有時候需要對系統(tǒng)進(jìn)行一些比較費時而且占用資源的維護(hù)工作,這些工作適合在深夜進(jìn)行,這時候用戶就可以事先進(jìn)行調(diào)度安排,指定任務(wù)運行的時間或者場合,到時候系統(tǒng)會自動完成這一切工作。
要使用自動啟動進(jìn)程的功能,就需要掌握以下幾個啟動命令。