![如何在后台发送一组命令](https://linux22.com/image/666143/%E5%A6%82%E4%BD%95%E5%9C%A8%E5%90%8E%E5%8F%B0%E5%8F%91%E9%80%81%E4%B8%80%E7%BB%84%E5%91%BD%E4%BB%A4.png)
我正在编写自己的通用初始化脚本,我借鉴了各种策略,并想出了
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
它在停止时正确地终止子进程,如果终止则重新启动服务等等。
现在我必须将这段代码作为后台作业运行,而不是直接在启动时运行)
我已经测试过的简单有效的解决方案是将这部分移动到它自己的脚本中并将其&。
但是我想知道是否有办法将这些命令分组并在后台发送,而无需移动第二个 shell 脚本。理想情况下,我希望将其设为要点,以便所有内容都放在一个文件中。
这可能吗?
答案1
在 shell 脚本中,您可以使用 将任何命令序列分组到子 shell 中,然后使用您已经知道的方法( cmd; cmd )
将该子 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
让守护进程继续运行的想法有点奇怪。我不确定我是否希望守护进程在发生以下情况时不断重新启动:任何失败。也许至少检查退出代码,并且只有在“不干净”退出时才重新启动。即使这样,如果它因为配置文件语法错误而死机(假设它有这样的事情),这也会导致它进入无限重启循环。