nohup和&究竟有啥區別?不少同學進行了回復,但並不是所有同學都理解得全對,今天把自己挖的坑自己填了。
測試代碼如下:
是一個輸出hello與循環輪數的死循環程序,每輸出一行就休眠1秒。
使用 ./a.out 前台運行程序,會是什麼效果呢?
程序每隔一秒會在終端輸出一個字符串。
此時如果鍵入Ctrl+C ,程序會收到一個SIGINT信號,如果不做特殊處理,程序的默認行為是終止(如上圖)。
使用 ./a.out& 後台運行程序,會是什麼效果呢?
如上圖:
ps確認一下,確認進程依然在運行,進程號是32389。
此時如果關掉session,程序會收到一個SIGHUP信號,此時會怎麼樣呢?
ps再次確認,可以看到關閉session之後,進程號是32389的a.out進程也關閉了。
使用nohup ./a.out 又會是什麼效果呢?
使用nohup 運行程序a.out,會發現:
手動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 &運行程序後,可以看到:
鍵入Ctrl + C,發送SIGINT信號,似乎沒反應。
關閉session,發送SIGHUP信號,再來看看。
ID為32524的進程依然存在,後續也只能用kill來關閉它。
結論
使用&後台運行程序:
使用nohup運行程序:
平日線上經常使用nohup和&配合來啟動程序:
同時,還有一個最佳實踐:
本文轉載自微信公眾號:架構師之路,因為老找不到地址,做下記錄~