Bash:在后台完成工作时执行


1

如果要一个接一个地运行一系列命令,则可以执行

command1 & command2 & command3 &

如果我执行 command1, 然后 按Ctrl + ž , 然后 bg,它会运行 command1 在后台。

我的问题是,如果我执行 command1 并将其发送到后台,是否可以告诉bash等待它完成,然后执行 command2command3 它终止后在后台?


如果你需要等到它完成,你为什么要把它放在后台?
glenn jackman

1
只是为了说清楚,你写道:“你想要逃跑 系列 命令“,而你的示例代码 command1 & command2 & command3 & 将运行所有命令 平行 在后台。但是,如果要运行它们 连续 那你应该用 && 代替 &,如在 command1 && command2 && command3
Martin Thorsen Ranang

sleep 1 && echo "1" && sleep 1 && echo "2" & 将执行 睡觉,回声,睡眠,回声 在系列中,在提示时提供提示。当打印“1”和“2”时,它们将显示在光标处,但不会包含在您输入的任何内容中。
Hannu

Answers:


1

命令 wait,没有进一步的规格, 等待 为所有活动子进程的结束 。这意味着如果还有另一个进程,它将等待最后一个结束。

可以调用Wait来指定ID :ID可以通过或者 PID (进程ID)或 工作规范 。而且,如果它不是单个命令而是管道, wait 将等待完整管道的结束(见下文)。

所以 wait 7165 它将使用ID 7165等待进程结束 wait %2 这份工作 [2]

在脚本中,您可以存储使用变量发送的最后一个作业的PID $!;您需要存储该值,因为它将在每次执行命令后更新。

#!/bin/bash
...
command1 &                             # Another command in background  job [1]
command2 && command2b && command2c &   # The command in background      job [2]
PID_CMD1=$!                            # Store the PID of the last job, job [2]

some_other_commands       # ...       

                          # With this command you will 
wait                      # block all until command0 and all  
                          # the pipe of command1 are completed or...

wait $PID_CMD1            # With this command you will wait only the end
                          # of command1 pipeline or...

wait %2                   # With this command you'll wait the end of job [2]    
                          # Note that if the command 1 fails or is really fast 
                          # you can have for the command 2 the job ID 1
command3 &                # job [1] again! it's possible to recycle the numbers
command4 &                # job [2] 

man bash

shell关联一个 工作 与每个管道。它保留当前正在执行的作业的表,可以使用jobs命令列出。当bash以异步方式(在后台)启动作业时,它会打印一条如下所示的行:
[1] 25647
指示此作业是作业编号1,并且与此作业关联的管道中的最后一个进程的进程ID是25647.单个管道中的所有进程都是同一作业的成员。 Bash使用作业抽象作为工作控制的基础......

你可以阅读更多关于等待的内容 help wait


2

假设您在开始后想要做其他事情 command1,但在等待它完成之前,请使用内置的shell wait

command1 &
some_other_command
wait  # block until command1 completes

command2 &
command3 &
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.