1. 程式人生 > >Linux下的作業管理

Linux下的作業管理

轉自 http://blog.csdn.net/ancient_wind/article/details/9858907

程序的一個比較正式的定義是:在自身的虛擬地址空間執行的一個單獨的程式。

Linux作業系統包括三種不同型別的程序,每種程序都有自己的特點和屬性。 
互動程序——由一個shell啟動的程序。互動程序既可以在前臺執行,也可以在後臺執行。 
批處理程序——這種程序和終端沒有聯絡,是一個程序序列。 
監控程序(也稱守護程序)——Linux系統啟動時啟動的程序,並在後臺執行。

程序和作業的概念也有區別。一個正在執行的程序稱為一個作業,而且作業可以包含一個或多個程序,尤其是當使用了管道和重定向命令。例如“nroff -man ps.1|grep kill|more”這個作業就同時啟動了三個程序。

作業控制指的是控制正在執行的程序的行為。比如,使用者可以掛起一個程序,等一會兒再繼續執行該程序。shell將記錄所有啟動的程序情況,在每個程序過程中,使用者可以任意地掛起程序或重新啟動程序。作業控制是許多shell(包括bash和

tcsh)的一個特性,使使用者能在多個獨立作業間進行切換。

一般而言,程序與作業控制相關聯時,才被稱為作業。

在大多數情況下,使用者在同一時間只執行一個作業,即它們最後向shell鍵入的命令。但是使用作業控制,使用者可以同時執行多個作業,並在需要時在這些作業間進行切換。這會有什麼用途呢?例如,當用戶編輯一個文字檔案,並需要中止編輯做其他事情時,利用作業控制,使用者可以讓編輯器暫時掛起,返回shell提示符開始做其他的事情。其他事情做完以後,使用者可以重新啟動掛起的編輯器,返回到剛才中止的地方,就象使用者從來沒有離開編輯器一樣。這只是一個例子,作業控制還有許多其他實際的用途。

直接將命令放到後臺“

執行”的&

 在bash的環境下,

 前臺指:你可以控制的作業

後臺指:在記憶體可以自行執行的作業,你無法直接控制它,除非以bg/fg等命令將該作業調用出來。

範例:

[[email protected] ~]# tar –zpcf /tmp/etc.tar.gz /etc &

[1] 24874  <== [job number] PID

[[email protected] ~]#     <==可以繼續工作,不受影響。

這裡job1在後臺繼續工作,你可在前臺繼續操作linux。過了一會,會突然出現這個資料:

[1] + Done        tar –zpcf  /tmp/etc.tar.gz /etc  #這是表示[1]作業已經完成

該命令最大的好處就是不怕被“[Ctrl]+c”這個中斷指令來中斷了

這裡就會出現一個問題,如果上面的命令是

[[email protected] ~]# tar –zpcvf /tmp/etc.tar.gz /etc &

 這時在後臺執行的命令,如果有stdout和stderr時,它的資料是輸出到螢幕上,所以我們無法看到提示符,也就無法完好地控制前臺作業。所以,最好是使用資料流重導向,將輸出資料傳至某個檔案中。我們可以這樣做:
[[email protected] ~]# tar –zpcvf  /tmp/etc.tar.gz  /etc > tpm/log.txt  2>&1  &
這樣,資料都傳送到/tmp/log.txt中,自然不會影響到前臺作業。

  二、 將“當前”作業放到後臺“暫停”:[crtl]+Z

如果你正在進行vi,但你想查詢某個檔案,需要到bash環境搜尋。此時你可以暫時離開vi

[[email protected] ~]# vi ~/.bashrc

 # 在vi 的一般模式下,按ctrl+z

[1]+  Stopped      /usr/bin/vim ~/.bashrc  #(+)表示當前在後臺下預設的作業

[[email protected] ~]#   <== 獲取了前臺的控制權

三、 觀察當前後臺作業狀態:jobs

  [[email protected] ~]# jobs [-lrs]

  引數:

   -l:除了列出作業號之外,同時列出PID

   -r:僅列出正在後臺執行的作業

   -s:僅列出正在後臺暫停的作業

  範例:

[[email protected] ~]# jobs –l

  [1]+ 24988 Stopped     /usr/bin/vim ~/.bashrc

  [2]- 25006 Stopped     /usr/bin/vim ~/.bash_history

   一般來說,直接執行jobs即可。在上面的輸出中,有(+ -)號。(+)表示預設的作業。所以說“當前我有兩個作業在後臺,兩個作業都是暫停的,如果我僅輸入fg時,那麼[1]會被拿到前臺處理”

  四、 將後臺作業拿到前臺處理,fg

   [[email protected] ~]# fg %jobnumber

   範例:

[[email protected] ~]# jobs

    [1]+ 24988 Stopped     /usr/bin/vim ~/.bashrc

    [2]- 25006 Stopped     /usr/bin/vim ~/.bash_history

   [[email protected] ~]# fg   <==預設取出+的作業,即[1]

   [[email protected] ~]# fg %2 <==直接規定取出的作業號碼

  五、 作業在後臺執行:bg

   之前都是將作業放到後臺去“暫停”,而bg實現一個作業在後臺執行。

[[email protected] ~]# find / -perm +7000

    #此時,請立刻按ctrl+z暫停

    [1]+ stopped       find / -perm +7000

   [[email protected] ~]# 

   [[email protected] ~]# jobs ; bg %1 ; jobs

    [1]+ Stopped         find / -perm + 7000

    [1]+ find / -perm +7000 &

    [1]+ Running         find / -perm +7000 &

    此時Stopped變成了Running,命令列的最後多了一個&符號,表示該作業在後臺啟動了。

注意:1-5操作過程中“%jobnumber”可以將“%”省略直接加jobnumber即可。

六、 管理後臺作業:kill

   [[email protected] ~]# kill –signal %jobnumber

   [[email protected] ~]# kill –l

    引數:

    -l:列出當前kill能夠使用的訊號(注意是小寫L)

    -1:重新讀取一次引數的設定檔案(類似reload)   ---對應的訊號為SIGHUP

     -2:表示與由鍵盤輸入ctrl+c同樣的動作         ---對應的訊號為SIGINT

     -9:立刻強制刪除一個作業                    ---對應的訊號為SIGKILL

     -15:以正常方式終止一項作業                 ---對應的訊號為SIGTERM 

[[email protected] ~]# jobs

    [1]+ Stopped         vim bashrc

   [[email protected] ~]# kill -9 %1             #以強制方式刪除

   [1]+ 已刪除          vim bashrc     

   [[email protected] ~]# kill –SIGTERM %1      #-SIGTERM與15是一樣的

   說明一下以正常方式與強制方式來終止作業的區別:例如,用vi編輯檔案的時候會產生一個.filename.swp檔案,如果以正常方式來結束作業,那麼.filename.swp檔案會主動被刪除;相反以強制的方式來結束作業,那麼.filename.swp檔案會繼續存在檔案系統中。

   注意:kill可以幫我們將訊號傳送給某個作業(%jobnumber)或者是某個PID(直接輸入數字),也就是說,kill後面直接加數字與加上%的情況是不同的。