一、作業管理的場景
作業管理(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私房菜_基礎學習篇》(第二版)
(完)