nohup ./start.sh &
&的意思是在後臺運行, 當你在執行 ./start.sh & 的時候, 即使你用ctrl C, 那麼start.sh照樣運行(因爲對SIGINT信號免疫)。 但是要注意, 如果你直接關掉shell後, 那麼,start.sh進程同樣消失。 可見, &的後臺並不硬(因爲對SIGHUP信號不免疫)。
nohup的意思是忽略SIGHUP信號, 所以當運行nohup ./start.sh的時候, 關閉shell, 那麼start.sh進程還是存在的(對SIGHUP信號免疫)。 但是, 要注意, 如果你直接在shell中用Ctrl C, 那麼start.sh進程也是會消失的(因爲對SIGINT信號不免疫)
所以, &和nohup沒有半毛錢的關係, 要讓進程真正不受shell中Ctrl C和shell關閉的影響, 那就用同時使用nohup ./start.sh &
結論:
使用&後臺運行程序:
-
結果會輸出到終端
-
使用Ctrl + C發送SIGINT信號,程序免疫
-
關閉session發送SIGHUP信號,程序關閉
使用nohup運行程序:
-
結果默認會輸出到nohup.out
-
使用Ctrl + C發送SIGINT信號,程序關閉
-
關閉session發送SIGHUP信號,程序免疫
平日線上經常使用nohup和&配合來啓動程序:
-
同時免疫SIGINT和SIGHUP信號
同時,還有一個最佳實踐:
-
不將信息輸出到終端標準輸出,而是用日誌組件將信息記錄到日誌文件裏:nohup.out