我正在编写自己的通用init脚本,我已经从各处采取策略,并提出了
trap 'kill $(jobs -p)' EXIT; until $DAEMON $DAEMONOPTS > /var/log/${NAME}.log 2>&1 & wait ; do echo "Server '$NAME' crashed with exit code $?. Respawning.." > /var/log/${NAME}.log 2>&1 & echo $! sleep 1 done
它停止正确杀死subprocess,如果死亡则重启服务。
现在我必须将这段代码作为后台作业而不是直接启动)
我已经testing过的简单解决scheme就是将这个部分移到自己的脚本中。
然而,我想知道是否有办法将这些命令分组并将它们发送到后台,而不需要第二个shell脚本来移动。 理想情况下,我想把它作为一个要点,所以它应该都在一个单一的文件。
这甚至有可能吗?
在shell脚本中,可以使用( cmd; cmd )将子shell中的任何命令序列组合在一起,然后使用&将该子shell放在背景中,如您所知; 例如使用你的示例代码:
( trap 'kill $(jobs -p)' EXIT; until $DAEMON $DAEMONOPTS > /var/log/${NAME}.log 2>&1 & wait ; do echo "Server '$NAME' crashed with exit code $?. Respawning.." > /var/log/${NAME}.log 2>&1 & echo $! sleep 1 done ) &
虽然我不得不说, until ... sleep观念,让守护进程运行有点奇怪。 不确定如果发生任何故障,我会希望守护程序无限重启。 也许至less检查退出代码,只有在退出“不干净”的情况下才能重新启动。 即使如此,如果它由于configuration文件语法错误而死亡(假设它有这样的事情),那也将导致它进入无尽的重新启动循环。