这是我正在尝试做的一个最小的例子:
# 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 时使用。