セマフォ/ロックとして使用できる Unix コマンドは何ですか?

セマフォ/ロックとして使用できる Unix コマンドは何ですか?

複数のBashシェルスクリプトを並列に実行したいのですが、競合状態は避けたいです。Unixコマンドとは本当にこの目的に使用できるアトミックは何ですか? また、それらをどのように使用できますか?

答え1

flock(1)

#!/bin/bash

# Makes sure we exit if flock fails.
set -e

(
  # Wait for lock on /var/lock/.myscript.exclusivelock (fd 200) for 10 seconds
  flock -x -w 10 200

  # Do stuff

) 200>/var/lock/.myscript.exclusivelock

これにより、「(」と「)」の間のコードは一度に 1 つのプロセスによってのみ実行され、プロセスがロックを長時間待機することがなくなります。

答え2

lockfileがシステムにインストールされていない場合は、 が作業を行います。これはアトミック操作であり、ディレクトリがすでに存在する場合は失敗します (コマンドライン スイッチmkdirを追加しない限り)。-p

create_lock_or_wait () {
  path="$1"
  wait_time="${2:-10}"
  while true; do
        if mkdir "${path}.lock.d"; then
           break;
        fi
        sleep $wait_time
  done
}

remove_lock () {
  path="$1"
  rmdir "${path}.lock.d"
}

答え3

lockfile(1)は良い候補のように見えますが、これはプロックメールパッケージですが、まだマシンにインストールされていない可能性があります。これは非常に人気のあるパッケージなので、まだインストールされていない場合は、システム用にパッケージ化する必要があります。私が確認した 4 つのシステムのうち 3 つにはインストールされており、他のシステムでも利用可能です。

使い方は簡単です:

#!/bin/sh
LOCKFILE=$HOME/.myscript/lock
mkdir -p `dirname $LOCKFILE`

echo Waiting for lock $LOCKFILE...
if lockfile -1 -r15 $LOCKFILE
then
    # Do protected stuff here
    echo Doing protected stuff...

    # Then, afterward, clean up so another instance of this script can run
    rm -f $LOCKFILE
else
    echo "Failed to acquire lock!  lockfile(1) returned $?"
    exit 1
fi

私が指定したオプションにより、最大 15 秒間、1 秒ごとに再試行されます。永久に待機させたい場合は、「-r」フラグを削除してください。

答え4

おそらく、lockfile コマンドが必要なことを実行するでしょう。

lockfile ~/.config/mylockfile.lock
.....
rm -f important.lock

関連情報