脚本退出后执行后台进程

Posted

技术标签:

【中文标题】脚本退出后执行后台进程【英文标题】:Execute background process after script has exited 【发布时间】:2015-10-31 00:21:08 【问题描述】:

前面的问题(TLDR 风格),因为这是一篇冗长的帖子:有没有更好的方法来启动 2 个链式命令(即 cmd1;cmd2)作为脚本中的后台进程,同时允许原始脚本完全退出?

3 年前有人问过与此类似的问题,但它没有满足我的需求。这个问题最终通过让后台进程在脚本退出时启动 得到了回答。我特别需要在脚本退出后启动这个后台进程。

我有一种情况,我需要一个脚本才能完全运行并退出,但我需要脚本在脚本退出后执行 2 个后台任务。

任务如下:

sleep 5
service proprietaryAgent restart

睡眠只是为了让原始脚本有时间退出。所以我猜这个命令可能会在脚本退出时发生。问题是,“专有代理”。该代理是一种允许我远程运行脚本的机制。因此在脚本期间重新启动它是有问题的。我需要运行一个脚本,该脚本将启动一个后台作业然后退出,并且该后台作业基本上需要“稍等一下(给原始脚本时间完全退出),然后重新启动这个代理。”

我试过了:

sleep 5;service proprietaryAgent restart &
disown
exit 0

我已经试过了:

nohup sleep 5;nohup service proprietaryAgent restart &
exit 0

我很确定我看到那里的逻辑失败了,在作为前台进程启动睡眠时,脚本拥有“睡眠 5”调用,并且在睡眠完成之前不会退出,这会重新启动专有代理作为脚本正在退出。但是,这个问题的要求是propertyAgent必须在脚本退出之后启动,而不是在退出期间或之前。

我也试过了:

trap "nohup sleep 5;nohup service proprietaryAgent restart &" 0
exit 0

但是trap检测到退出,然后启动然后完全运行,然后允许脚本完全退出。所以这没有用。

所以我尝试过像傻瓜一样:

nohup sleep 5 &;nohup service proprietaryAgent restart &
exit 0

我真的不知道这是做什么的。我试了一下只是为了试一试。但在这种情况下(我认为)睡眠本身就是一个后台进程,并且与链接“;”断开连接这将导致下一个命令等待它。

最后我尝试了这个(基本上是让一个脚本编写第二个脚本,然后在后台启动它):

echo "#!/bin/bash" > /var/tmp/restartAgent.sh
echo "sleep 5" >> /var/tmp/restartAgent.sh
echo "service proprietaryAgent restart" >> /var/tmp/restartAgent.sh
chmod 755 /var/tmp/restartAgent.sh

nohup /var/tmp/restartAgent.sh &
exit 0

我想我已经接近了,虽然它仍然需要故障排除,但它又回到了最初的问题。有没有一种“更好”的方法可以解决这个问题?

【问题讨论】:

【参考方案1】:

您尝试的最后一件事应该可以正常工作。您可以绕过将命令写入单独的文件,而是执行以下操作:

nohup bash -c "sleep 10 ; service opsware-sas restart opswgw" &

另一个选项是使用at 命令来安排将来的作业。例如:

at -f /path/to/script.sh now + 1 minute

您需要一个为您预先制作的调用service opsware-sas restart opswgw 命令的外部脚本(或由父脚本创建的临时脚本)。

【讨论】:

太棒了!这次真是万分感谢。这正是我所需要的。

以上是关于脚本退出后执行后台进程的主要内容,如果未能解决你的问题,请参考以下文章

docker 容器启动后立马退出的解决方法

linux-ssh远程后台执行脚本-放置后台执行问题(转)

linux获取后台进程的控制台数据

linux脚本后台运行

Linux进程后台运行的几种方式

获取前一段时间完成的后台进程的退出代码