1. 程式人生 > >Linux的後臺執行:&和nohup

Linux的後臺執行:&和nohup

我們在使用Linux伺服器的時候,一般是使用終端利用SSH協議登入的。當你需要同時進行一些作業,但又不想開啟多個終端的話就需要用到後臺執行。

&

sh test.sh &

一些費時的作業可以這樣放在後臺執行,但需要注意的是後臺執行的作業如果有輸出,一樣會輸出到終端螢幕。有大量輸出的情況下,最好將輸出重定向至指定檔案,比如這樣:

sh test.sh > file.log 2>&1 &

關於重定向

Linux核心(kernel)利用檔案描述符(file descriptor)來訪問檔案。開啟現存檔案或新建檔案時,核心會返回一個檔案描述符。讀寫檔案也需要使用檔案描述符來指定待讀寫的檔案。常見的檔案描述符是stdin、stdout和stderr。
系統預留檔案描述符

  • 0 —— stdin(標準輸入)
  • 1 —— stdout(標準輸出)
  • 2 —— stderr(標準錯誤)

重定向將輸入文字通過擷取模式儲存到檔案。>表示的是覆蓋寫,如果需要追加寫則用>>
所以回到上面那個列子:

sh test.sh > file.log 2>&1 &

> file.log指的是標準輸出重定向至file.log檔案,因為預設就是標準輸出,所以這裡的1 > file.log中的1可以省略。
2>&1指的是標準錯誤重定向至標準輸出的位置,即file.log,因為標準輸出已經被重定向至file.log

裡了。
還有一種特殊的重定向方法:

sh test.sh > /dev/null

/dev/null是一個特殊的裝置檔案,這個檔案接受到任何資料都會被丟系,通常被稱為位桶、黑洞。任何被重定向至這裡的內容都會被丟棄。


nohup

不管是前臺還是後臺執行的作業,如果我們關閉終端視窗或者退出登入SSH甚至網路波動斷開連線,作業就會被終止。這是因為系統訊號SIGHUP的緣故。

關於系統訊號

登入Linux時,系統會分配給登入使用者一個終端(Session)。
在這個終端執行的所有程式,包括前臺程序組和後臺程序組,一般都屬於這個Session。
當用戶退出Linux登入時,前臺程序組和後臺有對終端輸出的程序將會收到SIGHUP訊號。
這個訊號的預設操作為終止程序,因此前臺程序組和後臺有終端輸出的程序就會中止。
系統訊號還有很多,這裡不展開。


所以nohup命令就登場了,它可以將程式以忽略掛起訊號的方式執行起來,被執行的程式的輸出資訊將不會顯示到終端。

nohup sh test.sh

這時輸出不會顯示在終端螢幕,而是自動追加到當前目錄的nohup.out檔案,當然你也可以重定向至你想要的地方,這樣就不會自動生成nohup.out
結合之前的&後臺命令,一般完整的用法就是這樣:

nohup sh test.sh > file.log 2>&1 &

這時你就可以放心的退出SSH登入,讓作業自動在伺服器後臺執行,之後回來查詢日誌檔案就可以啦。

END