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

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

後 ザ 乱交文書これ質問とこれBashでファイルにアトミック書き込み(追加)操作を実行する方法はまだわかりません。複数のインスタンスで実行されるスクリプトがあり、ある時点でデータをファイルに書き込む必要があります。

echo "$RESULT" >> `pwd`/$TEMP_DIR/$OUT_FILE

同時に実行されるすべてのスクリプトでこのファイルへのすべての書き込みをアトミックにするにはどうすればよいですか(あるインスタンスのデータが他のインスタンスのデータと重複しないように)

答え1

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

(
flock -x 200

# Put here your commands that must do some writes atomically

) 200>/var/lock/mylockfile 

そして、原子性でなければならないすべてのコマンドを()に入れます。

答え2

flock連動運転方式の一つです。このユーティリティはutil-linuxツールセットの一部であり、Linuxでのみ使用できます。追加のユーティリティは、より広い範囲のプラットフォームで利用でき、setlockDaniel J. Bernsteinのdaemontoolsパッケージにあるユーティリティに基づいています。

  • setlockデーモンツールから
  • setlockBruce Guenterのdaemontools-encore
  • s6-setlockLaurent Bercotのs6
  • chpstGerrit 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" "$@" } 
[...]
outfile echoes "$RESULT"
または、シェル構文に固執し、インターロックの下で実行される2番目のシェルとして解釈するようにしてください。これは、シェル変数が環境変数としてエクスポートされない場合、いくつかの重要な引用が必要です。

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

もちろん、これは出力ファイルに書き込むこと以外に他のものに一般化することができます。

setlock mylockfile sh -c '...interlock何か...'

関連情報