Bashでの群れと実行は安全ですか?

Bashでの群れと実行は安全ですか?

私が見た「標準」ロックスライスは次のとおりです。

(
    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プロセスは開かれたファイルディスクリプタを保持し、クラスタはファイルディスクリプタを使用するため、機能する必要があることを曖昧に覚えています。ただし、これを明確かつ明示的に説明する文書が見つかりません。

記録上、これはLinux固有です。

答え1

はい。 Execは単にプロセスイメージを置き換えますが、それでも同じプロセスなので、それに関連するオペレーティングシステムレベルのロックは変更されません。

動作していることを確認するのはとても簡単です。

ロックする

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

スクリプト

sleep 100

./lock次の100秒以内に2回実行してみてください。ロックは一度だけ獲得するため、ロックはexec解除されません。

答え2

はい、ロックはexecデフォルトのシステムコールで維持されます。execve、ファイル記述子が開いている限り。ファイル記述子は、execveexec時に閉じるように構成されていない限り、開いたままになり、シェルリダイレクトによって生成されたファイル記述子はclose-on-execとして表示されません。

関連情報