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

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

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

#!/bin/bash

tail -f /dev/null &
echo "pid is "$!

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

答案1

$!保证为您提供 shell 执行该命令的进程的 pid tail。 Shell 是单线程的,每个 shell 都存在于自己的进程中,并具有自己的变量集。$!一个贝壳是不可能的泄露到另一个 shell 中,就像在一个 shell 中分配一个 shell 变量一样,不会影响另一个 shell 中的同名变量(如果我们将通用变量fish)。

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

在:

true &
pid=$!

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

相关内容