私が見た「標準」ロックスライスは次のとおりです。
(
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
、ファイル記述子が開いている限り。ファイル記述子は、execve
exec時に閉じるように構成されていない限り、開いたままになり、シェルリダイレクトによって生成されたファイル記述子はclose-on-execとして表示されません。