誰かがflockとファイル記述子を使用してファイルをロックし、ロックされたファイルに書き込む方法を説明できますか?


14

このflockツールは初めてであり、私が知っている限りではファイル記述子を使用したことがないので、気をつけてください。

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

ファイルをロックし、リクエストを実行し、テキストファイルに書き込むコードは次のとおりです。

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

これはこれについて正しい方法ですか?私の実際のスクリプトはこれより少し長いですが、flock構文をbashスクリプトに追加すると壊れるようです。

誰かがこれらのファイル記述子がどのように機能するかを説明し、私がファイルを正しくロックしているかどうかを教えてくれたら素晴らしいでしょう!

回答:


8

すると、排他ロックを取得する( 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
)

ただし、curlコマンドでファイルに書き込む必要があります。どのようにflock機能するのか誤解していますか?ファイル記述子が初めてです:/
DuckPuncher

1
@DuckPuncherロックメカニズムは、ファイルに対して実行できる読み取り/書き込み操作とは別のものです。だから、curlまだファイルに書き込むことができます。これはNFSでは安全ではない(または機能しない可能性もあります)が、NFSを介したファイルのロックにシェルスクリプトを使用しないでください。を使用するとbash、読み取りと書き込みの両方でファイルを開くこともできますが200<> resp.txt、これによって何も変更されないはずです。
vinc17
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.