1. 程式人生 > >linux 使程序後臺執行:&/nohup/disown

linux 使程序後臺執行:&/nohup/disown

在linux機器上工作,大多都是本地電腦通過xshell之類的工具連線到遠端的linux主機上。當我們在終端或者控制檯工作時,不希望由於執行比較耗時的作業而佔用了當前螢幕;
也可能我們的電腦和遠端的linux主機之間的網路不穩定,我們連線的終端隨時可能斷開,終端斷開時,我們執行的命令也會終止,這是我們不希望的;
也可能我們啟動的作業非常耗時了,快要下班了,等不及這個作業完成了,必須回家做飯吃,嗯,這個很重要,此時要是直接關閉終端,那麼這個作業就會終止,以前的計算就白費了,這也是我們不希望的。
如何解決這些問題呢,下面一個一個來看。

解決方法:
我們知道,當用戶登出(logout)或者網路斷開時,終端會收到 HUP(hangup)訊號從而關閉其所有子程序。因此,我們的解決辦法就有兩種途徑:要麼讓程序忽略 HUP 訊號,要麼讓程序執行在新的會話裡從而成為不屬於此終端的子程序。

hangup 名稱的來由
在 Unix 的早期版本中,每個終端都會通過 modem 和系統通訊。當用戶 logout 時,modem 就會結束通話(hang up)電話。 同理,當 modem 斷開連線時,就會給終端傳送 hangup 訊號來通知其關閉所有子程序。

& – 讓命令後臺執行

當我們在終端或者控制檯工作時,如何讓耗時的作業而不再佔用了當前螢幕?
當在前臺執行某個作業時,終端被該作業佔據,此時可以在命令後面加上&實現後臺執行。例如:

command > output.txt 2>&1 &

注意: 這個命令若需要和使用者互動,就不能放在後臺執行,因為這樣你的命令就會卡在互動的地方;
命令執行可能輸出結果到螢幕上,這樣就干擾你工作,所以上面命令使用了“> output.txt 2>&1”,把結果重定向輸出到指定檔案中。

特別注意,使用這種方式時,若由於網路原因或者我們主動斷開終端時,這個命令也會終止;
所以確信終端短時間內不會斷開時,這種方式還是挺好用的。

nohup – 讓提交的命令忽略hangup訊號

使用&命令後,作業被提交到後臺執行,當前終端/控制檯沒有被佔用,但是一旦把當前終端關掉(退出賬戶時),提交的作業就會停止執行。nohup命令可以在你退出賬戶之後繼續執行相應的程序。nohup就是不掛起(no hang up)的意思。
命令的一般形式為:

nohup command > output.txt 2>&1 &

注:使用了nohup之後,很多人就不管了,其實這樣有可能在當前賬戶非正常退出或者結束的時候,命令還是
會自己結束的。所以在使用nohup後臺執行命令之後,需要使用exit正常退出當前賬戶,這樣才能保證命令一直在後臺執行。

disown – 脫離終端的子程序

我們已經知道,如果事先在命令前加上 nohup就可以避免 HUP訊號的影響。但是如果我們未加任何處理就已經提交了命令,該如何補救才能讓它避免 HUP 訊號的影響呢?
這時想加nohup已經為時已晚,只能通過作業排程和disown來解決這個問題。

  • 使用 ctrl + z 把這個命令掛起(Suspend)
  • 使用 jobs 命令檢視後端命令,只是你會發現這個命令是 stopped 狀態
  • 使用 bg %N (注意,這個N是對應的編號),讓這個命令後端執行
  • 再次使用 jobs 命令檢視,發現那個命令的狀態就變為 running 了,就是已經是後臺執行了
  • 使用 disown -h %N,使這個程序執行在新的會話裡,從而成為不屬於此終端的子程序
  • exit正常退出這個終端