为什么“(睡眠 10 和睡眠 1);等待”return 在 1 秒而不是 10 秒后?
Why does "(sleep 10 & sleep 1); wait" return after 1 second instead of 10?
wait
没有参数应该等待所有子进程,但是
(sleep 10 & sleep 1); wait
returns 在 1 秒而不是 10 秒后,因此无法等待 sleep 10
完成。
为什么会这样,我该如何解决?
括号创建了一个子shell——一个全新的shell进程,仅用于这两个命令。
wait
命令只等待shell自己的children(事实上,它能等的就这么多); grandchildren不算。由于 sleep
进程是子进程 shell 的 children 而不是主进程 shell,它们不能被 wait
编辑。
因此,发生的情况是:
- Subshell被创建到运行
sleep 10 & sleep 1
,mainshell等待它完成
- Subshell 运行s
sleep 10
, 因为&
立即继续处理
- Subshell 运行s
sleep 1
,并等待它完成
- 一秒后,
sleep 1
退出。
- subshell 没有要处理的命令,因此退出。
- 所有子shells children(即
sleep 10
)都是孤立的,re-parented到init
进程(不是原来的shell).
- 主 shell 继续
wait
命令。
- 因为shell没有children,
wait
returns马上
- 9 秒后,
sleep 10
退出,init
清理它。
让 wait
识别命令的唯一方法是不要在子 shell 中退出它。在此示例中,您可以通过使用大括号或完全省略大括号来实现。无论哪种情况,首先 sleep 10
将是 运行,然后 sleep 1
将是 运行,当 sleep 1
结束时 wait
将 运行 直到 sleep 10
完成。
wait
没有参数应该等待所有子进程,但是
(sleep 10 & sleep 1); wait
returns 在 1 秒而不是 10 秒后,因此无法等待 sleep 10
完成。
为什么会这样,我该如何解决?
括号创建了一个子shell——一个全新的shell进程,仅用于这两个命令。
wait
命令只等待shell自己的children(事实上,它能等的就这么多); grandchildren不算。由于 sleep
进程是子进程 shell 的 children 而不是主进程 shell,它们不能被 wait
编辑。
因此,发生的情况是:
- Subshell被创建到运行
sleep 10 & sleep 1
,mainshell等待它完成- Subshell 运行s
sleep 10
, 因为&
立即继续处理
- Subshell 运行s
sleep 1
,并等待它完成 - 一秒后,
sleep 1
退出。 - subshell 没有要处理的命令,因此退出。
- 所有子shells children(即
sleep 10
)都是孤立的,re-parented到init
进程(不是原来的shell).
- 所有子shells children(即
- Subshell 运行s
- 主 shell 继续
wait
命令。 - 因为shell没有children,
wait
returns马上 - 9 秒后,
sleep 10
退出,init
清理它。
让 wait
识别命令的唯一方法是不要在子 shell 中退出它。在此示例中,您可以通过使用大括号或完全省略大括号来实现。无论哪种情况,首先 sleep 10
将是 运行,然后 sleep 1
将是 运行,当 sleep 1
结束时 wait
将 运行 直到 sleep 10
完成。