開發環境中的rabbitmq總是會掛掉,rabbitmq的執行都是ssh遠程登錄執行命令:
rabbitmq-server &
認為加了&,進程會在后台執行不會受到終端的影響。所以不知道什么問題,后面想到使用strace查看該進程到底在退出時遇到了什么。
使用strace記錄下日志,到第二天的時候果然RMQ再次倒下。查看日志,看到最后一行內容:
--- SIGHUP (Hangup) @ 0 (0) ---
好了,這個就是該進程的'臨終遺言'了。看來是被某個進程發來的SIGHUP信號弄死的。【系統對SIGHUP信號的默認處理是終止收到該信號的進程。所以若程序中沒有捕捉該信號,當收到該信號時,進程就會退出。】
后面查詢資料得知:
- 內核驅動發現終端(或偽終端)關閉,給終端對應的控制進程(bash)發 SIGHUP
- bash 收到 SIGHUP 后,會給各個作業(包括前后台)發送 SIGHUP,然后自己退出
- 前后台的各個作業收到來自 bash 的 SIGHUP 后退出(如果程序會處理 SIGHUP,就不會退出)
看來我們可憐的進程的'死因'就是這個了,有點盪氣回腸。
那么我們現在就可以采取兩種方式(我所想到的)來讓后面的進程不再受到'死因'的影響:
- 使用nohup命令
nohup rabbitmq-server &
- 使用setsid命令
setsid rabbitmq-server &
我們可以通過strace看到RMQ進程在使用nohup命令時,會收到SIGHUP信號,但是進程不受影響。使用setsid命令時,RMQ進程是不會收到SIGHUP進程的。
相關資料:關閉終端后,后台作業退出的分析