1. 程式人生 > >Linux nohup和&的功效

Linux nohup和&的功效

nohup和&究竟有啥區別?不少同學進行了回覆,但並不是所有同學都理解得全對,今天把自己挖的坑自己填了。

測試程式碼如下:

是一個輸出hello與迴圈輪數的死迴圈程式,每輸出一行就休眠1秒。

使用 ./a.out 前臺執行程式,會是什麼效果呢?

程式每隔一秒會在終端輸出一個字串。

此時如果鍵入Ctrl+C ,程式會收到一個SIGINT訊號,如果不做特殊處理,程式的預設行為是終止(如上圖)。

使用 ./a.out& 後臺執行程式,會是什麼效果呢?

如上圖:

  • 首先會在終端顯示程序號是32389

  • 鍵入Ctrl + C,發出SIGINT訊號,程式會繼續執行

ps確認一下,確認程序依然在執行,程序號是32389。

此時如果關掉session,程式會收到一個SIGHUP訊號,此時會怎麼樣呢?

ps再次確認,可以看到關閉session之後,程序號是32389的a.out程序也關閉了。

使用nohup ./a.out 又會是什麼效果呢?

使用nohup 執行程式a.out,會發現:

  • 前臺沒有出現程序號

  • 有一個“忽略輸入,輸出至nohup.out”的提示

  • hello的輸出也沒有出現在前臺

手動ps看程序號,這次a.out的程序號是32437。

此時如果關掉session,程式會收到一個SIGHUP訊號,程式會不會關閉呢?

關掉session後,再次ps看一下,ID為32437的a.out程序還在。

這些只能通過kill把程式幹掉了,killall之後,ps檢視程序已經關閉。

killall之後,檢視發現多了一個nohup.out檔案,不過這個檔案的大小是0,有點奇怪,啟動程式的時候,明明提示了“appending output to nohup.out”呀,先把問題遺留在這,測試一下Ctrl +C。

仍如上圖,使用nohup啟動a.out,如果鍵入Ctrl+C ,程式收到SIGINT訊號後,直接關閉了。

最後測試一下nohup和&同時使用,即用nohup./a.out &執行程式,又會是什麼效果呢?

使用nohup ./a.out &執行程式後,可以看到:

  • 會在終端顯示程序號是32524

  • 也會有一個“忽略輸入,輸出至nohup.out”的提示

鍵入Ctrl + C,傳送SIGINT訊號,似乎沒反應。

關閉session,傳送SIGHUP訊號,再來看看。

ID為32524的程序依然存在,後續也只能用kill來關閉它。

結論

使用&後臺執行程式:

  • 結果會輸出到終端

  • 使用Ctrl + C傳送SIGINT訊號,程式免疫

  • 關閉session傳送SIGHUP訊號,程式關閉

使用nohup執行程式:

  • 結果預設會輸出到nohup.out

  • 使用Ctrl + C傳送SIGINT訊號,程式關閉

  • 關閉session傳送SIGHUP訊號,程式免疫

平日線上經常使用nohup和&配合來啟動程式

  • 同時免疫SIGINT和SIGHUP訊號

同時,還有一個最佳實踐:

  • 不要將資訊輸出到終端標準輸出,標準錯誤輸出,而要用日誌元件將資訊記錄到