web-dev-qa-db-ja.com

bashの群れを機能させることができません

Bash flock関数に関して、私が周りで見たものからサンプルのbashスクリプトを導き出しました。私がやります:

func()
{
    42>/home/foo
    flock -e 42 || exit 1
    echo "hello world"
    sleep 5
}

次に、func&を連続して実行します。各ファイルは、すぐにhello worldを出力しますが、最初のメッセージはメッセージを出力し、残りは終了することを期待しています。ここで何が欠けていますか?

1
corsel

flockのマニュアルページの例に基づいて、次の例を検討してください。

#!/bin/bash

func() {
    echo "$$ trying to acquire lock"
    (
        flock -e 42
        echo "lock acquired by $$"
        sleep 10
    ) 42> /tmp/mylock
    echo "lock released by $$"
}

func

ここで、そのスクリプトを1回実行すると、次のようになります。

$ bash ex.sh
22241 trying to acquire lock
lock acquired by 22241
lock released by 22241

このスクリプトの10秒のスリープウィンドウ内で2つのインスタンスを実行した場合、最初のインスタンスはバックグラウンドで実行され、イベントのシーケンスは次のようになります。

$ bash ex.sh& bash ex.sh
[1] 24518
24519 trying to acquire lock
24518 trying to acquire lock
lock acquired by 24519
lock released by 24519
lock acquired by 24518
$
lock released by 24518

この例では、2番目のプロセスがレースに勝ち、最初にロックを取得したプロセスです。次に、ロックを解放し、最初の(バックグラウンド)プロセスが取得できるようにしてから、ロックを解放しました。

最初のプロセスを開始する間に遅延を導入することで、最初のプロセスがレースに勝つ可能性を高めることができます。

$ bash ex.sh& sleep 1; bash ex.sh
[1] 30158
30158 trying to acquire lock
lock acquired by 30158
30179 trying to acquire lock
lock released by 30158
lock acquired by 30179
lock released by 30179
2
Andy Dalton