bashの群れが操作を開始できません

bashの群れが操作を開始できません

私はbash関数について見たものからサンプルbashスクリプトを思いつきましたflock。私は以下が欲しい:

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

次に連続して実行しますfunc&。各項目hello worldはすぐに印刷され、最初の項目はメッセージを印刷し、残りは終了します。私がここで何を見逃しているのでしょうか?

ベストアンサー1

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

スクリプトを一度実行すると、次のようになります。

$ 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

おすすめ記事