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]" ; }または、シェル構文に固執し、インターロックの下で実行されている2番目のシェルによって解釈されるようにします。シェル変数が環境変数としてエクスポートされていない場合は、自明ではない引用符が必要です。
[…]
outfile echo "$RESULT"
setlock mylockfile sh -c 'echo '"$RESULT"' >> "./'$TEMP_DIR'/'$OUT_FILE'"'
もちろん、これは出力ファイルへの書き込み以外にも一般化されます:
setlock mylockfile sh -c '… interlocked ; stuff …'