bashでflock&execは安全ですか?


13

私が見た「標準」ロックスニペットは次のようになります...

(
    flock -n 200 || exit 1;
    # do stuff
) 200>program.lock

execその時点で使用することは安全ですか?サブプロセスはロックを保持しますか?

(
    flock -n 200 || exit 1;
    exec /usr/bin/python vendors-notcoolstuff.py
) 200>program.lock

exec'dプロセスは開いているファイル記述子を保持しており、flockはファイル記述子を使用するため、動作するはずです。しかし、私はそれを決定的かつ明確にする文書を見つけることができません。

記録のために、これはLinuxに固有です。

回答:


3

はい、ロックはにわたって保持されexecます。execveファイル記述子が開いたままである限り、基盤となるシステムコール全体でロックが保持されます。ファイル記述子はexecve、execで閉じるように構成されていない限り、開いたままになり、シェルリダイレクトによって作成されたファイル記述子は、close-on-execとしてマークされません。


6

はい、そうです。Execはプロセスイメージを置き換えるだけですが、それでも同じプロセスなので、それに関連付けられたOSレベルのロックは同じままです。

動作を確認するのは非常に簡単です。

ロック

(
    flock -n 200 || exit 1;
    echo "locked"
    exec ./script
) 200>program.lock

脚本

sleep 100

./lockその後100秒以内に2回実行してみてください。ロックは1回しか取得できexecません。ergo はロックを解除しません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.