守护进程在shellclosures时退出

我有一个脚本启动一个守护进程,然后睡20秒。 如果我在SLES11 SP1或RHEL6上运行脚本,那么在脚本退出后,进程仍在运行。

如果我在SLES11 SP3或RHEL6.3上运行该脚本,那么脚本退出后,该进程不再运行。 整个20秒的睡眠过程继续运行,并在进程退出时死亡。

该脚本是通过expect运行的,所以脚本的整个shell会随着进程而退出。 显然,如果这不是一个守护进程,它开始我不会感到惊讶。 另外,我怀疑问题不是操作系统版本,而是我们设置新服务器的方式不同(不知道这些差异是什么,而旧服务器是在几年前build立的)。

在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都被杀死。 什么可能导致这个?

UPDATE

我已经在工作的服务器上打印了相同的输出。 在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 

脚本退出后,断开控制terminal。 我不知道为什么它不会在较新的服务器上这样做。

UPDATE

这是实际启动OpenMQ的脚本部分。 -bgnd标志是应该守护它的。

 sudo -u openmq $IMQ_HOME/bin/$EXECUTABLE -bgnd $BROKER_OPTIONS $ARGS > /dev/null 2>&1 & 

UPDATE

我偶然发现了一些真正奇怪的行为。 如果我将命令更改为:

 sudo -u openmq sldkhglksj; $IMQ_HOME/bin/$EXECUTABLE -bgnd $BROKER_OPTIONS $ARGS > /dev/null 2>&1 & 

然后我得到sldkhglksj: command not found当然sldkhglksj: command not found ,但是… openmq进程没有被杀死。 如果我把这个换掉了,它就会被杀死。

UPDATE

回想起来,似乎神奇的命令改变了sudo不能运行在实际的openmq启动上,这导致我相信sudo是以某种方式涉及的。

您可能会遇到此处logging的问题: https : //access.redhat.com/knowledge/solutions/180243 。

它指出,在RHEL / CentOS 6.3(sudo-1.7.4p5-11.el6.x86_64)附带的版本中,类似于您所描述的操作的sudo行为已经发生了变化。 在RHEL 6和6.3之间看到不同的行为,这涉及到sudo,这就是我指出这一点的原因。

一些select(我没有100%的答案,只是抛出想法):

  • 如果你有根级别的访问,看起来像你一样,尝试运行脚本,而不使用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来解决这个问题(哈克,我知道,但你可以build立/安装在临时位置来testing)
  • 在Massimo参考的答案中看看huponexit shopt ,如果这不是我上面提到的sudo问题,那听起来很有希望

在后台进程后,尝试在其自己的一行上添加一个disown 。 这应该阻止你的shell在退出时向任何subprocess发送信号。

您可以在您希望在脚本中守护进程的命令前缀:

  nohup command-that-you-want-to-demonize & 

然后当外部脚本完成时,程序将继续运行。

尝试添加</dev/null以及启动命令。

不知道-bgnd标记应该如何背景你的进程,但如果标准input丢失,进程可能会死亡,这正是当你失去SSH连接时会发生什么。 你已经把所有的输出都扔到了bitbucket,你可能要确定没有input。

我不禁要解释行为的变化,但我的build议就是忍受。