注:1.這裏說的Bash不單純的指Bash,泛指shellshell
2.這裏的後臺指的是Bash下面避免任務(Jobs)被Ctrl+C中斷的一種場景,與咱們說的deamon那種後臺工做的進程不是一個概念,注意區分。bash
簡介ide
Bash工做管理是指在Bash界面下同時進行多個工做任務的管理。舉例來講:登錄 bash 後, 你能夠一邊複製文件、一邊進行數據搜尋、一邊編譯程序、一邊編寫程序等等,這些任務都是Bash的子進程。Bash工做管理只能管理本身Bash下面的工做,不能把別人Bash下面的工做拿到本身Bash下執行,即便你是root也不行。可是root能夠在這個Bash下乾死在另外一個Bash下的進程(參考:Is it possible to kill another user's process using sudo privileges?)。同理,你也不能由tty1的Bash去管理tty2的Bash。spa
前臺和後臺unix
後臺工做的任務不能夠等待terminal的輸入,即不能與用戶交互。同時後臺的jobs也無法Ctrl+C暫停。使用jobs能夠查看後臺有哪些任務,以及他們當前的狀態(Stopped、Running)。把後臺任務拿到前臺繼續運行,使用fg命令;後臺Stopped狀態的任務繼續運行,使用bg命令;對於刪除後臺任務,或重啓後臺任務等更復雜的操做,則藉助Linux信號機制實現。下面對關鍵命令作解釋。日誌
把任務直接丟到後臺運行code
後臺運行最大的好處就是能夠不被Ctrl+C終端,可是對於後臺任務的stdout和stderr仍是會輸出到前臺影響前臺顯示。舉例:yum -y install qemu-kvm &blog
雖然我把安裝命令放到後臺執行,可是安裝過程輸出仍是會顯示在屏幕上。一般的作法是把stdout和stderr重定向到日誌文件,後臺任務執行過程當中輸出信息在日誌文件中查看。演示以下進程
tar -zpcvf /tmp/etc.tar.gz /etc > /tmp/log.txt 2>&1 &
在任務最後加&表示本次任務直接丟到後臺,執行的時候前臺會顯示當前任務編號以及任務PIDterminal
這個任務的意思是:解壓etc.tar.gz到指定目錄,stdout和stderr都從定向到log.txt
暫停任務
想象這樣一種場景,我正在vi passwd文件,忽然先看看主機名是什麼,因而我暫停vi操做。去編輯hostname問價,vi hostname後,我有暫停出去vi resolv.conf,還沒編輯完,我又暫停。此時我總共暫停了3個任務。使用jobs能夠查看後臺任務。
jobs
選項與參數:
-l :除了列出 job number 與命令串以外,同時列出 PID 的號碼;
-r :僅列出正在背景 run 的工做;
-s :僅列出正在背景當中暫停 (stop) 的工做。
[root@localhost etc]# jobs [1] Stopped vi /etc/passwd (wd: ~) [2]- Stopped vi hostname [3]+ Stopped vi /etc/resolv.conf
很顯然,我這3個任務都是Stopped狀態。
後臺工做拿到前臺處理
上面有3個Stopped的任務,使用fg能夠將後臺暫停任務拿到前臺繼續運行。
fg
選項與參數:
%jobnumber :jobnumber 爲工做號碼(數字)。注意,那個 % 是無關緊要的!
+:運行前面有+號的那個任務
-:運行前面有-號的那個任務
後臺暫停任務繼續運行
若是後臺暫停任務不拿到前臺運行,在後臺也是能夠繼續運行的,使用bg命令
bg
選項與參數:
%jobnumber :jobnumber 爲工做號碼(數字)。注意,那個 % 是無關緊要的!
更復雜的操做
對於後臺任務,若是想執行刪除或者重啓操做,就要藉助Linux信號機制。使用kill個後臺任務發信號
signal
kill -signal %jobnumber
選項與參數:
-l :這個是 L 的小寫,列出目前 kill 可以使用的訊號 (signal) 有哪些?
-1 :從新讀取一次參數的配置檔 (相似 reload);
-2 :表明與由鍵盤輸入 [ctrl]-c 一樣的動做;
-9 :馬上強制刪除一個工做;
-15:以正常的程序方式終止一項工做。與 -9 是不同的。
任務脫機管理
若是你是以遠程連線方式鏈接到你的 Linux 主機,而且將任務以 & 的方式放到後臺執行, 請問,在任務還沒有結束的狀況下你離線了,該工做還會繼續進行嗎?答案是『否』!不會繼續進行,而是會被中斷掉。
若是有個任務要執行一個月,你難道不吃不喝等他一個月嗎?固然不是
Linux下例行工做命令at能夠解決這個問題,nohup命令也能夠解決這個問題
語法以下
nohup [命令與參數] <==在終端機前景中工做nohup [命令與參數] & <==在終端機背景中工做