有時候一個任務啟動並執行時間很長,需要將其放在後台運行,否則推出控制台後任務就會被終止,本文講解一下怎麼讓任務在後台運行。
比如一個shell指令碼,longjobs.sh運行要很長時間,並且運行中有資訊列印到控制台。
1,如果直接通過 ./longjobs.sh啟動了任務,這時候控制台不斷有資訊列印出來,如果想把該任務調到後台,可以通過Ctr+z(在bash中(Linux的預設shell,如果是在其他Unix系統中,需要在啟動任務之前通過bash命令切換到bash,或者ksh切換到ksh,不是所有的shell都支援Ctr+z))將任務暫停。
2,通過命令bg 將任務調到後台。(但是由於不斷有資訊列印到控制台,所有實際上這時候也沒法在控制台上工作,這時候如果退出控制台,任務也會被結束。)
【因此,在unix中運行shell任務的時候最好要將列印到螢幕的資訊從新定向到檔案中,1,./longjobs.sh>longjobs.out,2,Ctr+z,3,bg 調到後台,這是後退出控制台,
(從bash中退出exit,回到預設的shell,退出控制台(關掉putty,任務會繼續執行),但是如果在還處於bash的時候就關掉putty,任務會終止】
所以,如果想把任務放在後台一直運行,不應該依賴bg來實現,而應該通過nohup來實現:(而且在所有的shell中都可行)。
該命令的一般形式為:nohup command &
在預設情況下該作業的所有輸出都被重新導向到一個名為nohup.out的檔案中,也可以另外指定了輸出檔案,如下:
nohup ./longjobs.sh > longjobs.out 2>&1 &
nohup的意思在終端斷開(hang up)的時候,伺服器端仍然運行,注意要在nohup命令運行後按任意鍵回到shell提示符後再斷開.
這裡再補充一點&& 和&的區別
&&是用來在一次執行兩個命令 cmd1 && cmd2,如果前面的cmd1運行成功,則繼續運行cmd2,否則cmd2不運行.
date && time,兩個命令都執行.
datq && time,兩個命令都不執行,因為datq不存在.(而datq;time則會datq失敗,time正常運行)
另外,||的作用正好與&&相反。