shell關閉時守護程序退出
我有一個腳本,它啟動一個守護程序,然後休眠 20 秒。如果我在 SLES11 SP1 或 RHEL6 上執行腳本,那麼在腳本退出後,程序仍在執行。
如果我在 SLES11 SP3 或 RHEL6.3 上執行腳本,那麼在腳本退出後,程序將不再執行。該程序繼續執行整個 20 秒睡眠,並在程序退出時被終止。
該腳本通過 expect 執行,因此腳本的整個 shell 將隨程序退出。顯然,如果這不是一個守護程序,它正在啟動我不會感到驚訝。另外,我懷疑問題不在於作業系統版本,而在於我們設置新伺服器的方式不同(但不知道這些差異是什麼,舊伺服器是幾年前設置的)。
在 20 秒內,如果我執行 ps,程序將執行,我得到以下資訊:
root 4699 1 0 15:14 pts/2 00:00:00 sudo -u openmq /opt/PacketPortal/openmq/default/bin/imqbrokerd -bgnd -autorestart -silent -port 7676 -Dimq.service.activelist=admin,ssljms -D openmq 4701 4699 0 15:14 pts/2 00:00:00 /bin/sh /opt/PacketPortal/openmq/default/bin/imqbrokerd -bgnd -autorestart -silent -port 7676 -Dimq.service.activelist=admin,ssljms -Dimq.ssl openmq 9095 9063 54 16:21 pts/2 00:00:02 /usr/java/latest/bin/java -cp /opt/PacketPortal/openmq/default/bin/../lib/imqbroker.jar:/opt/PacketPortal/openmq/default/bin/../lib/imqutil.jar:/opt/PacketPortal/ope
4699 的父程序為 1 的事實似乎向我表明該程序已被正確守護。但是,在期望腳本退出後,4699 和 4701 都被殺死了。這可能是什麼原因造成的?
更新
我已經在工作的伺服器上列印了相同的輸出。在 20 秒的睡眠中,我得到:
openmq 18652 1 0 15:44 pts/1 00:00:00 /bin/sh /opt/PacketPortal/openmq/default/bin/imqbrokerd -bgnd -autorestart -silent -port 7676 -Dimq.service.activelist=admin,ssljms -Dimq.ssljms.tls.port=7680 openmq 18686 18652 8 15:44 pts/1 00:00:02 /usr/java/latest/bin/java -cp /opt/PacketPortal/openmq/default/bin/../lib/imqbroker.jar:/opt/PacketPortal/openmq/default/bin/../lib/imqutil.jar:/opt/PacketPortal/ope
在 20 秒的睡眠後,我得到:
openmq 18652 1 0 15:44 ? 00:00:00 /bin/sh /opt/PacketPortal/openmq/default/bin/imqbrokerd -bgnd -autorestart -silent -port 7676 -Dimq.service.activelist=admin,ssljms -Dimq.ssljms.tls.port=7680 openmq 18686 18652 5 15:44 ? 00:00:02 /usr/java/latest/bin/java -cp /opt/PacketPortal/openmq/default/bin/../lib/imqbroker.jar:/opt/PacketPortal/openmq/default/bin/../lib/imqutil.jar:/opt/PacketPortal/ope
腳本退出後,它將斷開控制終端。我想知道為什麼它不在較新的伺服器上這樣做。
更新
這是實際啟動 OpenMQ 的腳本部分。-bgnd 標誌應該是它的守護程序。
sudo -u openmq $IMQ_HOME/bin/$EXECUTABLE -bgnd $BROKER_OPTIONS $ARGS > /dev/null 2>&1 &
更新
我偶然發現了一些真正奇怪的行為。如果我將命令更改為:
sudo -u openmq sldkhglksj; $IMQ_HOME/bin/$EXECUTABLE -bgnd $BROKER_OPTIONS $ARGS > /dev/null 2>&1 &
然後我
sldkhglksj: command not found
當然得到但是…… openmq 程序沒有被殺死。如果我把那個換掉,它就會被殺死。更新
回想起來,神奇的命令似乎將 sudo 更改為不在實際的 openmq 啟動上執行,這讓我相信 sudo 以某種方式涉及。
您可能會遇到此處記錄的問題:https ://access.redhat.com/knowledge/solutions/180243 。
它指出,與您描述的操作類似的操作的 sudo 行為在 RHEL/CentOS 6.3 (sudo-1.7.4p5-11.el6.x86_64) 附帶的版本中發生了變化。您看到 RHEL 6 和 6.3 之間的不同行為以及這涉及 sudo 的事實是我指出這一點的原因。
一些嘗試的選擇(我沒有 100% 的答案,只是拋出想法):
- 如果您具有 root 級別訪問權限,看起來像您一樣,請嘗試在不使用的情況下執行腳本
sudo
,例如- 有關更多資訊su -c '/opt/PacketPortal/openmq/default/bin/imqbrokerd -bgnd -autorestart -silent -port 7676 -Dimq.service.activelist=admin,ssljms -D' - openmq
,請參閱http://www.linfo.org/su.html- 安裝一個舊版本的
sudo
來解決這個問題(我知道,hacky,但你可以在一個臨時位置建構/安裝它來測試它)- 查看
huponexit
shopt
Massimo 引用的答案,如果這不是我上面提到的 sudo 問題,那聽起來很有希望