cURLリクエストを実行して出力をというファイルに書き込むbashスクリプトがありますresp.txt
。複数のユーザーがスクリプトを実行し、同時にテキストファイルを編集することを心配することなく、ファイルに書き込むことができるように排他的ロックを作成する必要があります。時間。
以下は、ファイルをロックし、要求を実行し、テキストファイルに書き込むことが期待されるコードです。
(
flock -e 200
curl 'someurl' -H 'someHeader' > resp.txt
) 200>/home/user/ITS/resp.txt
これがこの問題を解決する正しい方法ですか?私の実際のスクリプトはこれより少し長いですが、flock
bashスクリプトに構文を追加すると中断されるようです。
誰かがこれらのファイル記述子がどのように機能するかを説明し、ファイルを正しくロックしていることを教えてください。
答え1
これにより( flock -e 200; ... ) 200> file
ファイルが切り捨てられるため、これは間違っています。file
今後排他的なロックを取得します。私はあなたがこれをしなければならないと思います:
touch resp.txt
(
flock -e 200
curl 'someurl' -H 'someHeader' > resp.txt
) 200< resp.txt
読み取り専用で開いたファイルにロックを設定します。
メモ。一部のシェルは9より大きいファイル記述子をサポートしていません。また、ハードコードされたファイル記述子が使用されている可能性があります。高度なシェル(bash、ksh93、zsh)を使用すると、次のことができます。
touch resp.txt
(
unset foo
exec {foo}< resp.txt
flock -e $foo
curl 'someurl' -H 'someHeader' > resp.txt
)