【问题标题】: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

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

【问题讨论】:

    标签: bash shell


    【解决方案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 命令的外部脚本(或由父脚本创建的临时脚本)。

    【讨论】:

    • 太棒了!这次真是万分感谢。这正是我所需要的。
    猜你喜欢
    • 1970-01-01
    • 2019-06-23
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 2012-07-02
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    相关资源
    最近更新 更多