以下は、私がやろうとしている作業の最小限の例です。
# 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)を使用してみましたが、ほとんどのセキュリティ例ではサブシェルを使用してファイル記述子をバインドするため、親シェルの一意の識別子にアクセスできません。そして、サブシェルでdo_something_longを実行したくありません。あまりにも長い間ロックを維持しているからです。
答え1
説明した内容とほぼ同じようです。まず、サブシェルで実行される関数を定義します。
getuid() (
flock 9
oldid=$(<~/.uid)
newid=$((oldid+1))
echo $newid >&9
echo $newid
) 9<>~/.uid
myuid=$(getuid)
それでは、新しいIDが必要なときに試してみてください。