GNU/Linux >> Linux の 問題 >  >> Linux

bashのファイルでアトミック書き込み操作を実行する

flock を使用する必要があるようです man の例 (http://linux.die.net/man/1/flock) のように

(
flock -x 200

# Put here your commands that must do some writes atomically

) 200>/var/lock/mylockfile 

そして、アトミックでなければならないすべてのコマンドを () に入れます。


flock 操作を連動させる方法の1つです。このユーティリティは util-linux ツールセットの一部であり、Linux でのみ使用できます。より幅広いプラットフォームで利用可能なその他のユーティリティは、Daniel J. Bernstein の setlock に基づいています。 彼の daemontools パッケージのユーティリティ:

  • setlock デーモンツールから
  • setlock Bruce Guenter の daemontools-encore から
  • s6-setlock Laurent Bercot の s6 から
  • chpst Gerrit Pape の runit から
  • runlock ウェイン・マーシャルのパープより
  • setlock 私のnoshツールセットから

これらのツールは、M. Kurenkov の回答 (flock 採用することもできますが、その回答では採用しません)。 setlock を呼び出す 連鎖ロードするプログラム 連動させなければならないコマンドに。 setlock それ自体がロックファイルを開いてロックし、そのプロセスでファイル記述子を開いたままにします。ロックは、そのプロセスが続く限り持続します (開いているファイル記述子を見つけて閉じることによって明示的にロックを解除するようにチェーンされた後続のコマンドを除く)。

質問の場合、出力行を生成するコマンドをインターロックする必要があります。これにより、外部が呼び出されることに注意してください。 echo シェル組み込み echo の代わりに コマンド:

setlock mylockfile echo "$RESULT" >> ./$TEMP_DIR/$OUT_FILE

この場合、出力ファイルを追加モードで開くことをインターロックする必要はありません。もしそうなら、ロック内でそのファイルを開く必要があり、fdredir のようなプログラムを使用する必要があります。 /redirfd :

setlock mylockfile fdredir --append 1 "./$TEMP_DIR/$OUT_FILE" echo "$RESULT"
必要に応じて、どれをシェル関数に変えることができますか:

outfile() { setlock mylockfile fdredir --append 1 "./$TEMP_DIR/$OUT_FILE" "[email protected]" ; }
[…]
outfile echo "$RESULT"
または、シェル構文に固執し、インターロックの下で実行されている2番目のシェルによって解釈されるようにします。シェル変数が環境変数としてエクスポートされていない場合は、自明ではない引用符が必要です。

setlock mylockfile sh -c 'echo '"$RESULT"' >> "./'$TEMP_DIR'/'$OUT_FILE'"'

もちろん、これは出力ファイルへの書き込み以外にも一般化されます:

setlock mylockfile sh -c '… interlocked ; stuff …'


Linux
  1. バッシュ‘?

  2. Bashのファイルでアトミック書き込み操作を実行しますか?

  3. MvはFsでアトミックですか?

  1. Bashでループを作成する方法

  2. .txt ファイルに書き込みますか?

  3. シェル - 変数の内容をファイルに書き込む

  1. Bashスクリプトをファイルに接続できますか?

  2. すべてのTmuxスクロールバックをファイルに書き込みますか?

  3. 1つのターミナルを終了するときに他のターミナルのBash履歴を更新しますか?