脚本退出后执行后台进程
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
命令的外部脚本(或由父脚本创建的临时脚本)。
【讨论】:
太棒了!这次真是万分感谢。这正是我所需要的。以上是关于脚本退出后执行后台进程的主要内容,如果未能解决你的问题,请参考以下文章