可以$!在并行运行的脚本中使用时会导致竞争条件吗?

phi*_*raj 8 bash shell-script parallelism

假设我有多个并行运行的 bash 脚本,代码如下:

#!/bin/bash

tail -f /dev/null &
echo "pid is "$!
Run Code Online (Sandbox Code Playgroud)

$!保证给我最近的后台任务的PID该脚本,或者是最近的后台任务在全球范围?我只是好奇,当它返回的 PID 来自另一个脚本中启动的进程时,依赖此功能是否会导致竞争条件。

Sté*_*las 16

$!保证为您提供 shell 执行该tail命令的进程的 pid 。Shell 是单线程的,每个 Shell 都生活在自己的进程中,并拥有自己的一组变量。有没有办法让$!一个壳的打算泄漏到另一个shell,就像在一个外壳赋予一个shell变量不会影响同名的变量在另一个shell(如果我们抛开通用变量中的fish壳) .

现在,tail -f /dev/null是一个无限期运行的命令,但对于短期命令,请注意,由于可能的进程 ID 数量有限,因此进程 ID 不可避免地最终会被重用。

在:

true &
pid=$!
Run Code Online (Sandbox Code Playgroud)

$pid将包含 shell 运行的进程的 id true,但是当您使用它时$pid,该 pid 很可能已经死了,并且可能指的是不同的进程。

  • @philraj,在 zsh 中,您可以在 SIGCHLD 上安装处理程序,这些处理程序在异步作业终止时进行处理,并使用 `$jobstate/$jobtext` 来检查那里的进程状态。并非没有竞争,因为在执行陷阱时已经收获了孩子,但这意味着非常短的竞争窗口,其中 pid 不太可能已经被重用。 (5认同)
  • 是的,我知道你的第二点,如果你想制作一个可靠的后台进程管理器,你需要使用一种语言来保证你知道子进程退出的确切时刻,并且它的 PID 已经返回到池中,显然 shell 脚本不能,因为它们会积极地获取子进程。谢谢你的清楚解释。 (3认同)