我有一个脚本启动一个守护进程,然后睡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) huponexit shopt ,如果这不是我上面提到的sudo问题,那听起来很有希望 在后台进程后,尝试在其自己的一行上添加一个disown 。 这应该阻止你的shell在退出时向任何subprocess发送信号。
您可以在您希望在脚本中守护进程的命令前缀:
nohup command-that-you-want-to-demonize &
然后当外部脚本完成时,程序将继续运行。
尝试添加</dev/null以及启动命令。
不知道-bgnd标记应该如何背景你的进程,但如果标准input丢失,进程可能会死亡,这正是当你失去SSH连接时会发生什么。 你已经把所有的输出都扔到了bitbucket,你可能要确定没有input。
我不禁要解释行为的变化,但我的build议就是忍受。