假设我已经有一个后台运行命令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) &