在我的测试中,到目前为止我总是得到正确的结果:
[fabian@manjaro ~]$ sleep 10 & echo $!
[1] 302657
302657
但是sleep
和echo
在这里同时执行,所以我希望有时会发生在正确设置echo
的值之前执行的情况。$!
这会发生吗?为什么到目前为止对我来说还没有?
我的最终目标:并行执行两个任务,然后等待这两个任务再继续。目前的计划是使用类似的东西foo & bar; wait $!; baz
。这是否总是有效,或者有时可以等待任意较旧的后台进程(或者根本不等待,如果$!
为空)?
答案1
所以
sleep 10 & echo $!
是两个命令
sleep 10 &
echo $!
他们在同一条线上并没有改变这一点。
因此 shell 会创建fork()
一个新进程,并将新进程的进程 ID 放入$!
.然后新进程将运行 ,sleep
而另一个进程将运行echo
。
因此,您可以确保$!
始终保留新进程的 PID,即使该进程失败;这是 的结果fork()
。
答案2
为了实现这一目标:
我的最终目标:并行执行两个任务,然后等待这两个任务再继续。
将这两个命令包含到脚本中,将它们发送到后台 ( &
) 就足够了,这样就可以立即启动并并行运行,并且wait
不需要捕获它们的 pid 并显式等待它们。
task1 &
task2 &
wait
echo both tasks finished
来自 posix 手册wait
:
如果在没有操作数的情况下调用等待实用程序,则它将等待,直到调用 shell 已知的所有进程 ID 都已终止并以零退出状态退出。