脚本退出后执行后台进程

时间:2015-08-07 14:06:55

标签: bash shell

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

3年前就提出了类似的问题,但它并没有满足我的需求。这个问题最终得到了回答,让后台进程启动作为脚本退出。在脚本退出后,我有一个特定的需要让启动此后台进程。

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

任务是这些:

sleep 5
service proprietaryAgent restart

睡眠只是为了让原始脚本有时间退出。所以我猜这个命令可以发生 as 脚本正在退出。问题是," proprietaryAgent"。此代理是一种允许我远程运行脚本的机制。因此在脚本期间重新启动它是有问题的。我需要运行一个脚本,它将启动后台作业然后退出,后台作业需要基本上等待(让原始脚本有时间完全退出),然后重新启动此代理。&#34 ;

我试过了:

sleep 5;service proprietaryAgent restart &
disown
exit 0

我已经尝试过了:

nohup sleep 5;nohup service proprietaryAgent restart &
exit 0

我很确定我看到那里的逻辑失败了,因为开始睡眠是一个前台进程,然后脚本拥有“睡眠5”和“睡眠5”。 envocation并且在sleep完成之前不会退出,这会在脚本退出时重新启动proprietaryAgent。但是,这个问题的要求是,authorAgent必须在脚本退出后开始,而不是在退出时或之前。

我也尝试过:

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

但陷阱检测到退出,然后开始然后完全运行,然后允许脚本完全退出。所以这没有用。

就像一个goober我试过:

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

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

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

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 个答案:

答案 0 :(得分:2)

你试过的最后一件事应该可以正常工作。您可以绕过将命令写入单独的文件并执行类似的操作:

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命令(或由父脚本创建的临时命令)。