ファイルをロックし、ロックされたファイルに書き込むために束とファイル記述子を使用する方法は?

ファイルをロックし、ロックされたファイルに書き込むために束とファイル記述子を使用する方法は?

cURLリクエストを実行して出力をというファイルに書き込むbashスクリプトがありますresp.txt。複数のユーザーがスクリプトを実行し、同時にテキストファイルを編集することを心配することなく、ファイルに書き込むことができるように排他的ロックを作成する必要があります。時間。

以下は、ファイルをロックし、要求を実行し、テキストファイルに書き込むことが期待されるコードです。

(
flock -e 200
curl 'someurl' -H 'someHeader' > resp.txt
) 200>/home/user/ITS/resp.txt

これがこの問題を解決する正しい方法ですか?私の実際のスクリプトはこれより少し長いですが、flockbashスクリプトに構文を追加すると中断されるようです。

誰かがこれらのファイル記述子がどのように機能するかを説明し、ファイルを正しくロックしていることを教えてください。

答え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
)

関連情報