在后台运行多个nohup命令


12

得到了两个命令cmd1和cmd2。在这两个中,cmd2需要更长的时间才能完成。需要先运行cmd2,然后再运行cmd1。

尝试通过以下方式运行它们:

bash$ (nohup ./cmd2>result2 &) && nohup ./cmd1>result1 &

要么

bash$ (nohup ./cmd2>result2 &) ; nohup ./cmd1>result1 &

但是两次我都可以看到cmd1不等待cmd2完成并且result1被填充。

当两者都应为nohup进程并在后台运行时,如何使cmd1在cmd2之后运行?



2
unix.stackexchange.com/questions/67006/…中的问题略有不同,因为我想保持执行顺序。如果我在理解其他问题上有误,请纠正我。
user33767

Answers:


12

您同时做了这两个程序cmd1cmd2并行运行。您说:“在后台启动cmd2,并切断与它的任何关联。在后台启动cmd1,并切断与之的任何关联。” 您的意思是:“在后台启动cmd2;完成后,启动cmd1(也在后台)。” 由于不再与后台任务相关联,因此您需要设计一个后台任务,该任务先执行cmd2,然后执行cmd1。这是cmd2; cmd1(或者更确切地说cmd2 && cmd1,只有在cmd2成功的情况下才运行cmd1),并且您需要nohup为此启动在后台运行的shell。

nohup sh -c './cmd2 >result2 && ./cmd1 >result1' &

谢谢。一切正常。是的,这就是我的想法,在使第一个cmd进入后台后,它不会影响第二个命令,即使我希望它等待第一个命令完成,第二个命令也会启动。我需要阅读有关向后台发送命令的手册。
user33767 2013年

3

如果您不介意不使用nohup:

{ command1 >result1 2>&1 && command2 >result2 2>&1 ; } & disown

会检查出来的。但是目前可以从Giles那里得到答案,那里的命令用sh包裹。无论如何
user33767

这是一个坏主意。当用户从控制台注销时,它将终止会话。
mootmoot

@mootmoot这可以正常工作,请自己检查;父外壳退出时,命令将不会收到SIGHUP。
artyom

是的,如果您使用crond / crontab运行命令,这对外壳程序是安全的。但这不是pty / xterm / ssh安全的。 unix.stackexchange.com/questions/3886/…–
mootmoot

2

只需使用:

nohup ./cmd2>result2 & nohup ./cmd1>result1 & nohup ./cmd3>result3 &

虽然运行multiple命令很好,但我想保持确切的执行顺序,即先执行cmd2,然后再执行cmd1,上述命令不会发生这种情况。谢谢
user33767

0

让我们知道您对cmd2和cmd1到底在做什么。它取决于任务的类型以及您希望从命令中获得的输出。如果您遇到两次点击输入键的问题,则可以通过我的这篇文章找到答案

你也可以这样走

nohup `cmd2 && ccmd1` > Output.out 2> Error.err < /dev/null & 

参见下面给出的屏幕截图,这里我正在使用3个命令,并且所有命令都一个接一个地执行。我使用反引号来完成此任务。在屏幕截图中,您还可以观察日期时间戳。sleep命令有60秒,因此60秒后我的下一个命令成功运行。我用作业命令检查是否有任何命令仍在后台运行。不用了 您可以看到的职位数是1。

nohup-multiple-command

如果该屏幕截图不可见,也可以在此链接中使用

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.