明らかにflock -o FD
は問題を解決しません。同じシェルスクリプトで、後でコマンドに対して余分FDを取り除くためにトリックはこのように、FDを閉じセクションに残りの部分をラップすることです:
var=outside
exec 9>>lockfile
flock -n 9 || exit
{
: commands which do not see FD9
var=exported
# exit would exit script
# see CLUMSY below outside this code snippet
} 9<&-
# $var is "exported"
# drop lock closing the FD
exec 9<&-
: remaining commands without lock
これは近く、ビットCLUMSY
ですFDの現在の位置はロックから離れている。
あなたは、これが「自然」コマンドの流れを失うことなく、一緒に属するものを一緒に保つリファクタリングすることができます
functions_running_with_lock()
{
: commands which do not see FD9
var=exported
# exit would exit script
}
var=outside
exec 9>>lockfile
flock -n 9 || exit
functions_running_with_lock 9<&-
# $var is "exported"
# drop lock closing the FD
exec 9<&-
: remaining commands without lock
別のフォークを犠牲にして自然なコマンドフローに加えて、追加のプロセスを保持して少しよりよい執筆少し異なるワークフローがあります。これはしばしば便利です。あなたが本当にbash
が閉じたFDを「隠す」に追加のファイル記述子を(紹介してスキップしていないことを確認したい場合は、
var=outside
exec 9>>lockfile
flock -n 9 || exit
(
exec 9<&-
: commands which do not see FD9
var=exported
# exit does not interrupt the whole script
exit
var=neverreached
)
# optionally test the ret if the parentheses using $?
# $var is "outside" again
# drop lock closing the FD
exec 9<&-
: remaining commands without lock
ところで:しかし、これは、外殻に変数を設定することはできません。実際のフォーク)。例えば、デーモンを実行してロックを永久に保持する場合、後者の変種が推奨されます。 lsof -nP
とstrace your_script
はお友達です。
Thx!まさに私が探していたもの。 – user1050755
'flock 9 'では動作しません。これは' flock -o lockfileコマンド[args ..] 'の場合のみです – Tino