Linux的作業管理


一、作業管理的場景

作業管理(job control)是在bash環境下使用的,主要使用在同一個bash中管理多個作業的場景,譬如登錄bash之后想同時復制文件、數據搜索,編譯。

但是bash的作業管理,有以下限制

  • 程序必須是shell的子進程
  • 程序不能等待terminal/shell的輸入


二、涉及到的命令

1. 將命令后台運行的&

bash環境下,存在前台(foreground)和后台(background)兩種作業:

  • 前台:你可以控制的作業
  • 后台:在內存可以自行運行的作業,無法直接控制,除非用命令調出來

把前台作業放在后台,最簡單的方式就是使用&:

tar -zpcf /tmp/etc.tar.gz /etc &
[1] 2080 # [job number] PID

將命令放到后台之后,bash會給這個命令一個作業號,后面帶這這個命令觸發的進程的PID,然后我們就可以繼續操作bash了。

放在后台的任務完成之后,會在屏幕上顯示以下信息:

[1]+  Done                    tar -czvf /tmp/etc.tar.gz /etc

表示作業號為[1]的作業已經完成。

把作業放在后台運行,其數據流實際上還是會直接在屏幕上打印出來,如果我們改動一下剛才的命令:

tar -zpcvf /tmp/etc.tar.gz /etc &

就會發現,作業的stdout和stderr依然會輸出到屏幕上,讓我們無法控制下一個前台作業,這個時候最好是用數據流重定向:

tar -zpcvf /tmp/etc.tar.gz /etc > /tmp.log 2>&1 &


2. 把當前作業放在后台並暫停:ctrl+z

譬如在編輯一個文件的時候想做別的東西:

vi ~/.bashrc
# 在vi的一般模式下,按下ctrl+z組合鍵
[2]+  Stopped                 vi ~/.bashrc

作業號后面的+號表示這是當前在后台默認的作業,Stopped表示這樣作業的狀態。


3. 觀察當前后台作業狀態:jobs

jobs [option]
option:
-l:除了列出作業號外,同時列出PID
-r:僅列出正在后台運行的作業
-s:僅列出正在后台暫停的作業

觀察當前bash中所有作業及其PID:

jobs -l
[2]-  2099 Stopped                 vi ~/.bashrc
[3]+  2110 Stopped                 vi ~/.bash_history

可以看到作業號后面的+-號,+表示默認作業,如果只輸入fg的時候,那么默認作業[3]會被提到前台。


4. 將后台作業提到前台處理:fg

fg %jobnum
option:
%jobnum:作業的號碼,%可有可無

如把剛才的默認作業提到前台:

fg

把作業號為2的作業提到前台:

fg %2


5. 使后台作業從暫停到運行:bg

譬如:

find / -perm +7000
# 立刻按下ctrl+z組合鍵
[1]+  Stopped                 find / -perm +7000

然后,讓這個作業在后台從暫停轉為運行,觀察之:

jobs;bg %1;jobs
[1]+  Stopped                 find / -perm +7000
[1]+ find / -perm +7000 &
[1]+  Running                 find / -perm +7000 &

可以觀察到狀態已經變為Runnig了,而且命令行最后多了一個“&”符號,表示該作業已經在后台啟動了。


6. 管理后台作業:kill

kill -signal %jobnum
kill -l
option:
-l:L的小寫,列出當前kill能夠使用的信號(signal)
signal:表示給后面的作業什么指示,用man 7 signal可查看詳細,常用的幾個signal有:
-1:重新讀一次參數的設置文件,類似於reload
-2:表示與由鍵盤輸入ctrl+c一樣的動作
-9:立刻強制刪除一個作業
-15:以正常方式終止一項作業,與-9不一樣

如找出當前后台作業,並將其刪除:

[root@centos ~]# jobs
[1]+  Stopped                 vi ~/.bashrcc
[root@centos ~]# kill -9 %1

[1]+  Stopped                 vi ~/.bashrcc
[root@centos ~]# jobs
[1]+  Killed                  vi ~/.bashrcc

值得注意的是-9通常用於強制刪除一個不正常的作業,-15則以正常步驟結束一項作業。

kill的作用很多,可以通過-l(L的小寫)參數查看相關的信號,常用的有1、9和15。


三、參考

《鳥哥的Linux私房菜_基礎學習篇》(第二版)

(完)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM