如何在 bash/shell 中增加持久的进程间计数器

如何在 bash/shell 中增加持久的进程间计数器

这是我正在尝试做的一个最小的例子:

# If it does not exist, create a file to persist the unique identifier
if [ ! -f ~/.uid ]; then
   echo 0 > ~/.uid
fi

# Increment the unique identifier in the ~/.uid file
echo 1 + $(<~/.uid) | bc > ~/.uid

# Launch expensive computation that uses this unique identifier
uid=$(<~/.uid)
do_something_long $uid

除此之外,该脚本的多个实例可以同时运行,并且 do_something_long 应该使用唯一标识符(最好是人类可读的,因此从 0 或 1 开始)调用。

我尝试使用集群(1)来获取锁,但大多数安全示例使用子 shell 绑定到文件描述符,这阻止我访问父 shell 中的唯一标识符。而且我不想在子 shell 中执行 do_something_long ,因为它会占用锁太长时间。

答案1

这似乎与您所描述的大致相同。首先定义一个在子 shell 中运行的函数。

getuid() (
    flock 9
    oldid=$(<~/.uid)
    newid=$((oldid+1))
    echo $newid >&9
    echo $newid
) 9<>~/.uid

myuid=$(getuid)然后在您需要新 ID 时使用。

相关内容