bash - 脚本退出后执行后台进程

标签 bash shell

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

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

我遇到这样一种情况,我需要一个脚本才能完全运行并退出,但我需要脚本在脚本退出后按顺序执行 2 个后台任务。

任务是这些:

sleep 5
service proprietaryAgent restart

sleep 只是为了让原始脚本有时间退出。所以我想这个命令可能会在脚本退出时发生。问题是,“proprietaryAgent”。该代理是一种允许我远程运行脚本的机制。因此在脚本期间重新启动它是有问题的。我需要运行一个脚本来启动后台作业然后退出,而该后台作业本质上需要“稍等片刻(让原始脚本有时间完全退出),然后重新启动该代理。”

我试过:

sleep 5;service proprietaryAgent restart &
disown
exit 0

我试过:

nohup sleep 5;nohup service proprietaryAgent restart &
exit 0

我很确定我在那里看到了逻辑失败,因为作为前台进程开始 sleep ,然后脚本拥有“ sleep 5”调用并且在 sleep 完成之前不会退出,这会重新启动 proprietaryAgent 作为脚本正在退出。然而,这道题的要求是proprietaryAgent必须在脚本退出后启动,而不是在退出期间或之前。

我也试过:

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

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

所以我试过了:

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

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

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

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

我想我已经接近这里了,虽然它仍然需要故障排除,但它又回到了最初的问题。我应该采用“更好”的方法来解决这个问题吗?

最佳答案

您最后尝试的应该可以正常工作。你可以绕过将命令写入一个单独的文件,而是做这样的事情:

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 命令。

关于bash - 脚本退出后执行后台进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31879698/

相关文章:

linux - 按目录中的所有者汇总文件大小的最快方法

linux - 将指定文件夹中的所有文件向上移动一个目录

linux - 列出所有用户和他们上次阅读邮件的时间,通过管道传输到多个输出

ruby-on-rails - Rails 开发模式下的日志轮换?

javascript - 递归地将javascript文件目录压缩为单个文件

linux -/etc/init.d/openibd : line 147: syntax error near unexpected token `;&'

shell - 使用 tcpdump 从命令行读取捕获的数据包

shell - 监视文件然后复制到另一个目录

linux - 使用 crontab 自动编写脚本

linux - yad - 使用变量