为什么“(睡10&睡1);等”1秒后返回而不是10?

时间:2018-01-05 18:19:42

标签: bash wait

没有参数的

wait应该等待所有子进程,但是

(sleep 10 & sleep 1); wait

在1秒而不是10秒后返回,因此无法等待sleep 10完成。

为什么会这样,我该如何解决?

1 个答案:

答案 0 :(得分:8)

括号创建一个子shell--一个全新的shell进程,仅用于这两个命令。

wait命令只等待一个shell自己的孩子(事实上,这就是它可以等待的全部);孙子不算数。由于sleep进程是子shell而不是主shell的子进程,因此无法为wait编译它们。

因此,会发生什么:

  1. 创建子shell以运行sleep 10 & sleep 1,主shell等待它完成
    1. 子shell运行sleep 10,并由于&
    2. 而立即继续处理
    3. 子shell运行sleep 1,等待它完成
    4. 一秒钟之后,sleep 1退出。
    5. 子shell没有要处理的命令,因此退出。
      • 所有子贝壳(即sleep 10)都是孤儿,并重新成为init进程的主体(原始shell)。
  2. 主shell继续执行wait命令。
  3. 由于shell没有子级,wait会立即返回。
  4. 九秒钟后,sleep 10退出,init清理它。
  5. wait识别命令的唯一方法是不在子shell中退出它。在此示例中,您可以通过使用花括号或完全省略大括号来实现。在任何一种情况下,都会运行第一个sleep 10,然后运行sleep 1sleep 1完成后wait将一直运行,直到sleep 10完成。