如果我已经运行了 nohup 后台命令,如何顺序运行新的后台命令?

如果我已经运行了 nohup 后台命令,如何顺序运行新的后台命令?

假设我已经有一个后台运行命令1

nohup command1 &

现在我想将command2提交到后台,但我不希望command2立即运行。我希望 command2 在 command1 完成后开始运行。

我怎样才能实现这个目标?

答案1

你还没有说你正在运行哪个外壳。这有帮助。您要求顺序使用为并行运行而创建的软件。对于许多人来说,简短的回答是你不能,但有一些想法可以尝试。

第一个(不保证顺序)是使用批处理命令将工作提交到批处理队列。这很简单。

另一种方法是编写一个脚本,允许您以批处理的方式向其发送命令。

我想您可以编写一个在后台运行的脚本,并且一次只允许除自身之外的一项后台作业完成。

在所有这些中,您最好的选择是批处理命令,这就是它创建的目的。如果我更多地了解情况,我可以更好地调整我的答案。例如,您是否需要在运行序列中的下一个命令之前检查上一个命令的结果?为什么不将所有命令输入到一个文件中并运行该文件?

告诉我更多,我可以帮助你更多。科斯塔

答案2

假设 bash 和您在同一个 shell 中启动作业,您也许可以使用内置wait命令。

wait: wait [id]
Wait for job completion and return exit status.

Waits for the process identified by ID, which may be a process ID or a
job specification, and reports its termination status.  If ID is not
given, waits for all currently active child processes, and the return
status is zero.  If ID is a a job specification, waits for all processes
in the job's pipeline.

所以:

sleep 60 &
wait %%; echo nextjobs; sleep 60 &

不幸的是,wait必须从您正在等待的进程的父进程所在的同一个 shell 中调用。这意味着您将无法在后台等待。即上面的示例会阻塞,直到第一个作业完成,然后将第二个作业提交到后台。

答案3

如果您的 Unix 实现了该fuser命令,这将是最简单的方法:

while [ "$(fuser nohup.out 2>/dev/null)" ]; do sleep 2; done
command2

确保在与 command1 相同的目录中运行它。

一点解释:

当您使用 运行命令时nohup,将创建一个名为 的文件nohup.out来存储命令标准输出和错误。

我建议的命令是监视该nohup.out文件以查看它是否仍然打开。如果是这种情况,则意味着第一个进程command1仍在运行。在这种情况下,while循环会等待两秒钟,然后重试。当command1结束时,nohup.out文件不再被使用并且循环被保留,允许command2运行。请注意,如果之后碰巧有另一个进程使用nohup.out,例如有人正在运行tail -f nohup.out.


编辑: 如果您的操作系统没有提供fuser,这里有一个可移植的方法:

1:识别后台进程的进程ID。如果您刚刚运行该nohup命令,则只需在 nohup 之后输入以下命令即可获取它:

pid=$!

否则,请使用以下之一:

pgrep command1
ps -eo pid,comm| grep -w [c]ommand1
top

或任何类似的方法并pid相应地设置变量。

完成后,运行以下命令:

while kill -0 $pid; do sleep 2; done
command2 

它将等待command1完成后再启动command2

答案4

做一个子壳?

nohup (commancd1;command2) &

相关内容