答え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でのみ使用できます。追加のユーティリティは、より広い範囲のプラットフォームで利用でき、setlock
Daniel J. Bernsteinのdaemontoolsパッケージにあるユーティリティに基づいています。
setlock
デーモンツールからsetlock
Bruce Guenterのdaemontools-encores6-setlock
Laurent Bercotのs6chpst
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" "$@" }または、シェル構文に固執し、インターロックの下で実行される2番目のシェルとして解釈するようにしてください。これは、シェル変数が環境変数としてエクスポートされない場合、いくつかの重要な引用が必要です。
[...]
outfile echoes "$RESULT"
setlock mylockfile sh -c 'echo '"$RESULT"' >> "./'$TEMP_DIR'/'$OUT_FILE'"'
もちろん、これは出力ファイルに書き込むこと以外に他のものに一般化することができます。
setlock mylockfile sh -c '...interlock何か...'