這裡介紹如何在 Linux 使用 nohup
執行程式,讓程式可以在離線或登出系統後繼續執行。
對於 Linux 程式開發者來說,若遇到程式需要跑很久的狀況,通常都會把程式透過 SSH 連線放在遠端的伺服器上面慢慢跑,但如果遇到要下班的時間需要離線時,程式卻還沒跑完的話,一般的情況就只能慢慢等,或是斷線隔天重跑,遇到這樣的狀況就可以考慮 nohup
來執行程式,或是使用 screen
也可以。
nohup
指令用法
當 Linux 使用者登出系統時,其所執行的每一個程式都會接收到一個 SIGHUP(hangup)這個信號,正常的程式收到這個信號之後,就會馬上停止執行。
如果想讓程式可以在離線或登出之後繼續執行,可以使用 nohup
這個指令來執行程式,這個指令可以讓程式忽略 SIGHUP 這個信號,所以當使用者登出或是斷線後,程式也可以正常執行,不會受到任何影響。
nohup
的用法很簡單,只要將要執行的程式放在 他的參數中即可,而通常我們會在尾端加上 &
把這個程式放在背景執行:
# 讓程式登出後可繼續執行 nohup /path/my_program &
nohup
在執行程式時,會將所有的輸出訊息導入 nohup.txt
這個文字檔,所以若要觀察程式的輸出,就要從這個檔案中查看:
cat nohup.txt
也可以使用 tail
自動即時顯示最新的輸出:
tail -f nohup.txt
指定輸出檔案
我們也可以透過重新導向輸出,將程式的輸出導入自己指定的檔案中:
# 重新導向輸出 nohup /path/my_program &> my_log.txt &
這樣就會將程式的輸出導入 my_log.txt
這個檔案中。
我們也可以將正常的訊息與錯誤訊息分開:
# 重新導向輸出 nohup /path/my_program > my.out 2> my.err &
降低執行優先權
因為使用 nohup
所執行的程式通常要跑很久,而且使用者登出後還是繼續跑,有時候為了避免長期佔用太多的系統資源,我沒會用 nice
指令讓程式以較低的優先權放在背景執行,盡量不要影響到其他正常的程式:
# 降低執行優先權 nohup nice /path/my_program &
使用 nice
時若不指定其 niceness 值,則預設為 10
。關於 nice
詳細的用法,請參考 nice
指令教學。
參考資料:鳥哥的 Linux 私房菜