一分鍾了解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信號

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

  • 不要將信息輸出到終端標准輸出,標准錯誤輸出,而要用日志組件將信息記錄到日志里

如果覺得治學還算嚴謹,幫忙轉一下。

尾巴

nohup啟動a.out,程序終止后,為啥nohup.out的大小是0?“hello”的字符串哪去了?

轉載:
https://mp.weixin.qq.com/s/nyT-FPdIUdJUiUCYVGEnTg


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM