前面的问题(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
我想我在这里关闭,虽然它仍然需要排除故障,但它回到原来的问题。是否有更好的"我应该接近这个方式吗?
答案 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
命令(或由父脚本创建的临时命令)。