会“$!”可靠地用“&”返回正确的ID?

会“$!”可靠地用“&”返回正确的ID?

在我的测试中,到目前为止我总是得到正确的结果:

[fabian@manjaro ~]$ sleep 10 & echo $!
[1] 302657
302657

但是sleepecho在这里同时执行,所以我希望有时会发生在正确设置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 都已终止并以零退出状态退出。

相关内容