SHELL-bash之作業控制

什麼是作業控制

作業控制是指有選擇的停止(暫停)並在後臺繼續(恢復)執行某個進程的能力

作業執行位置

  1. 前臺執行:通過終端啓動,且啓動後一直佔據終端;
  2. 後臺執行:可通過終端啓動,但啓動後即轉入後臺運行(釋放終端),Bash中創建後臺工作很簡單,在命令的後面添加連接符(&)即可。例如:

作業控制相關快捷鍵

  1. Ctrl+c:終止前臺執行的作業
  2. Ctrl+z:暫停前臺執行的作業

作業控制內部命令

#jobspec=%作業號,pid=進程號

  1. bg

    bg [jobspec...] 
    

    在後臺繼續執行每個暫停的作業,就好像啓動它們時帶有“&”一樣。如果沒有給定作業,則使用當前的作業。

  2. fg

    fg [jobspec...]
    

    在前臺繼續執行作業,並把它當做當前作業。如果沒有給定作業,則使用當前的作業。

  3. jobs

    jobs [-lnprs] [jobspec]
    

    -l:除了正常要顯示的信息外,還列出進程號。助記詞: List, 列出

    -n:只顯示上次把狀態通知用戶以後,已經改變了狀態的作業。助記詞: Notify, 上次通知

    -p:只列出作業進程組中首領進程的進程號。助記詞: Process, 進程號

    -r:只顯示正在運行的作業。助記詞: Running, 正在運行
    -s:只顯示已經停止的作業。助記詞: Stopped, 已停止

    如果給定作業指示,則只顯示該作業的信息。否則,列出全部作業的狀態信息。

    jobs -x 命令 [參數表]
    

    如果指定了-x選項,jobs 就會把命令或參數表中的作業指示用對應的進程組號替換,然後把參數表傳給命令並執行它,最後返回這個命令的返回狀態。

  4. kill

    kill [參數] [pid 或 %作業號]
    
    • 功能:

    • 發送指定的信號到相應進程。不指定型號將發送SIGTERM(15)終止指定進程。如果仍無法終止該程序可用“-KILL” 參數,其發送的信號爲SIGKILL(9),將強制結束進程,使用ps命令或者jobs 命令可以查看進程號。root用戶將影響用戶的進程,非root用戶只能影響自己的進程。

    • 選項

      -l信號,若果不加信號的編號參數,則使用“-l”參數會列出全部的信號名稱

      -a 當處理當前進程時,不限制命令名和進程號的對應關係

      -p指定kill 命令只打印相關進程的進程號,而不發送任何信號

      -s 指定發送信號

      -u 指定用戶

    • 注意:

      1、kill命令可以帶信號號碼選項,也可以不帶。如果沒有信號號碼,kill命令就會發出終止信號(15),這個信號可以被進程捕獲,使得進程在退出之前可以清理並釋放資源。也可以用kill向進程發送特定的信號。例如:

      kill -2 123
      

      它的效果等同於在前臺運行PID爲123的進程時按下Ctrl+C鍵。但是,普通用戶只能使用不帶signal參數的kill命令或最多使用-9信號。

      2、kill可以帶有進程ID號作爲參數。當用kill向這些進程發送信號時,必須是這些進程的主人。如果試圖撤銷一個沒有權限撤銷的進程或撤銷一個不存在的進程,就會得到一個錯誤信息。

      3、可以向多個進程發信號或終止它們。

      4、當kill成功地發送了信號後,shell會在屏幕上顯示出進程的終止信息。有時這個信息不會馬上顯示,只有當按下Enter鍵使shell的命令提示符再次出現時,纔會顯示出來。

      5、應注意,信號使進程強行終止,這常會帶來一些副作用,如數據丟失或者終端無法恢復到正常狀態。發送信號時必須小心,只有在萬不得已時,才用kill信號(9),因爲進程不能首先捕獲它。要撤銷所有的後臺作業,可以輸入kill 0。因爲有些在後臺運行的命令會啓動多個進程,跟蹤並找到所有要殺掉的進程的PID是件很麻煩的事。這時,使用kill 0來終止所有由當前shell啓動的進程,是個有效的方法。

    • 常用的信號:

      HUP 1 終端斷線

      INT2 中斷(同 Ctrl + C)

      QUIT 3 退出(同 Ctrl + \)

      TERM 15 終止

      KILL 9 強制終止

      CONT 18 繼續(與STOP相反, fg/bg命令)

      STOP 19 暫停(同 Ctrl + Z)

  5. wait

    wait [-n] [jobspec or pid]
    

    等待由jobspec或pid指定的進程退出並返回等待的最後一個命令的退出狀態

  6. disown

    disown [-ar] [-h] [jobspec ... or pid ...]
    

    如果沒有選項,則從活動作業表中移除第一個作業指示。

    -h:掛起,並不移除作業,而是給它一個標誌,使得shell在接收到SIGHUP信號時不會把這個信號轉發給它。

    如果沒有指定作業指示,並且也沒有指定-a-r選項,則使用當前作業。

    如果沒有指定作業指示,則-a選項所有會移除或標誌所有作業;而-r限制只操作正在運行的作業。

  7. suspend

    suspend [-f]
    
    • 掛起shell的執行,直到收到SIGCONT信號。
    • 除非使用-f選項,否則無法對login shell使用。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章