本來不準備寫這篇博客的,因為任務管理(job管理)非常非常常用,以至于覺得根本沒有必要去寫這樣一個東西。但想了下,還是記錄一下吧,也許有人會用到呢。
不知你是否碰到過這樣的情況,當你興致勃勃的打開VIM,寫代碼寫到正酣時,運營MM或者產品MM氣喘吁吁的跑過來:“趕緊幫我跑一下xx的數據,一會做PPT要用”??墒遣幌胫苯雨P閉當前的VIM,而且某些系統下,又不能新開tty(如設置了maxlogins參數)去執行這些任務,這可怎么辦?這其實就涉及到了任務(job)管理。
那么什么是任務管理?顧名思義,就是指在Bash中對同一個tty中的多個工作進行添加、刪除、處理等。由于Bash中的每個工作實際上是當前Bash的子進程,因此,從根本上說,job管理就是指對進程的管理。注意上述的表述中,使用了“同一個tty”這一字眼,這時因為,我們是無法通過tty1的job管理去管理tty2中的job的。例如,我們在tty3終端通過ctrl+z將vim放置到后臺暫停,在當前tty中,通過jobs命令查看到的后臺任務列表如下圖所示:
而這時登錄新的tty,通過jobs命令查看,發現并沒有jobs位于后臺:
剛才我們已經看到了,在vim編輯的過程中,通過ctrl+z快捷鍵的方式,可以將當前VIM放入后臺暫停,同時tty終端會輸出如下字樣的提示:
[1]+ Stopped vim
其中[1]指的是job的編號,在之后將工作放置到前臺,或者殺死后臺進程的時候會用到。
Stopped代表當前進程的狀態(實際上,通過ctrl+z方式放置到后臺的job默認都是Stopped狀態),vim指的是被放置到后臺的job。等等,那個加號+是什么意思?如果我們再放置2個job到后臺,通過jobs命令查看當前后臺的jobs列表,輸出如下:
發現不僅有+號,還有-號。其實+號指輸入fg命令時,默認會將標識為+號的job取到前臺來執行,-號則是+號job被fg之后的備胎。
2. 將命令丟到后臺執行 &在Bash下,經常會做一些比較耗費時間的工作,比如讀取log的腳本,可能需要10分鐘以上才能完成,總不能一直盯著吧?這時,最好的辦法在命令后面加上&,將其放入后臺執行
作為測試,我們在test.php中輸入如下內容:
<?php$i = 0;while($i++ < 30){ echo $i; sleep(1);}
然后將其拋入后臺執行:
我們看到,即使是在后臺執行,程序的輸出還是會輸出到Bash的標準輸出,即使你按了CTRL+C也不會有任何作用。這可以通過重定向解決:
php test.php 2>&1 >>test.log &
通過jobs命令查看jobs的狀態:
跟剛才的幾乎一樣,除了這次拋入后臺的是Running狀態。在任務執行完畢之后,屏幕會輸出如下字樣:
表明當前工作已經完成。
3. 將后臺工作拿到前臺來處理 fg (%jobnumber)前面只講了如何將工作放置到后臺以及如何查看后臺jobs狀態?,F在數據跑完了,運營MM走了,繼續打開剛才后臺的vim編碼吧。這需要用到fg命令
命令格式:fg [%jobnumber] . 其中[]中的內容可省,這時默認取出的是標識為+的job.如果要取出指定的job,需要傳入job編號:
fg %1
即可取出編號為1的job
4. 讓工作在后臺的狀態變成運行中 bg (% jobnumber)我們知道,通過CTRL+Z放置放置到后臺的job,默認是Stopped狀態的,如果要讓進程在后臺執行,應該怎么做呢?bg命令就是干這個的。
再次執行2中的腳本,不過這次在執行后,我們立即按下CTRL+Z使之暫停。jobs查看狀態:
標號為3的job即是我們剛剛加入的。
執行bg %3
再次查看jobs:
可以看到,job已經由Stopped狀態編程Running狀態,并且命令后面多了一個&
5. 殺死后臺的工作 kill現在,后臺的進程多了起來,如果有些job不需要執行了,放在后臺總歸是不好的。這時,可以通過kill命令刪除后臺的jobs. 命令格式:Kill – signal %jobnumber
這與kill殺死一般的進程基本沒什么區別,不同的是,這里是job的編號而不是進程的PID.
Signal是傳入的信號,常用的有:
-l 列出kill的可用信號
-1 重新讀取配置
-9 立即強制終止(不會有清理工作)
-15 正常終止一個job(會有一些后續的清理工作)。
為了保險起見,慎重使用-9參數。
最后,給幾個hint:
(1). VIM編輯過程中ctrl+z暫停手頭的工作,做一些其他的處理,是經常使用的操作。例如:為了防止修改的代碼不小心被同步到線上去,我們常常需要check編輯的文件已經放入了rsync的ignore-list中。
(2). 通過&放置到后臺的命令,雖然不會被CTRL+C中斷,但是默認所有的輸出都會輸出到屏幕,這應該通過重定向來解決。如果輸出的內容不需要或者忽略看,可以簡單的重定向到/dev/null設備。
(3). 如果一個腳本執行的時間較長,簡單放入后臺不管可能會因為TTY中斷而導致job中斷(即使是在后臺,tty中斷的情況下,job也會中斷的)。這時可以通過nohup命令將運行腳本放置到系統的后臺而不是當前tty的后臺,該命令類似于:
nohup php test.php 2>&1 &
現在,享受job管理帶來的便利吧。
新聞熱點
疑難解答