Bash

shell關閉時守護程序退出

  • December 12, 2012

我有一個腳本,它啟動一個守護程序,然後休眠 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 shoptMassimo 引用的答案,如果這不是我上面提到的 sudo 問題,那聽起來很有希望

引用自:https://serverfault.com/questions/457226