這裡介紹如何在 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 私房菜