Sepertinya Anda perlu menggunakan flock
seperti pada contoh dari 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
Dan letakkan semua perintah Anda yang harus atomik di ().
flock
adalah salah satu cara operasi interlocking. Utilitas adalah bagian dari perangkat util-linux dan hanya tersedia untuk Linux. Utilitas lain, tersedia di berbagai platform yang lebih luas, didasarkan pada setlock
Daniel J. Bernstein utilitas dari paket daemontools-nya:
setlock
dari daemontoolssetlock
dari daemontools-encore
milik Bruce Guenter s6-setlock
dari s6 Laurent Bercotchpst
dari runit Gerrit Paperunlock
dari pelaku Wayne Marshallsetlock
dari perangkat nosh saya
Alat-alat ini beroperasi dengan paradigma yang sedikit berbeda dengan yang digunakan dalam jawaban M. Kurenkov (yang flock
juga dapat mempekerjakan, tetapi tidak dalam jawaban itu). Seseorang memanggil setlock
program untuk memuat rantai untuk perintah yang harus saling bertautan. setlock
itu sendiri membuka dan mengunci file kunci, dan membiarkan deskriptor file terbuka dalam prosesnya. Kunci tetap ada selama proses itu berlangsung (kecuali jika perintah selanjutnya dirangkai untuk melepaskan kunci secara eksplisit dengan menemukan dan menutup deskriptor file yang terbuka).
Untuk kasus dalam pertanyaan, seseorang harus mengunci perintah yang menghasilkan baris keluaran, dengan menyadari bahwa ini memanggil perintah eksternal echo
sebagai pengganti echo
bawaan shell perintah:
setlock mylockfile echo "$RESULT" >> ./$TEMP_DIR/$OUT_FILE
Dalam hal ini tidak perlu interlock membuka file output dalam mode append. Jika ya, seseorang harus membuka file itu di dalam kunci, yang mengharuskan menggunakan program seperti fdredir
/redirfd
:
setlock mylockfile fdredir --append 1 "./$TEMP_DIR/$OUT_FILE" echo "$RESULT"mana yang bisa diubah menjadi fungsi shell jika diinginkan:
outfile() { setlock mylockfile fdredir --append 1 "./$TEMP_DIR/$OUT_FILE" "[email protected]" ; }atau tetap menggunakan sintaks shell dan menafsirkannya dengan shell kedua yang berjalan di bawah interlock, memerlukan beberapa kutipan non-sepele jika variabel shell seseorang tidak diekspor sebagai variabel lingkungan:
[…]
outfile echo "$RESULT"
setlock mylockfile sh -c 'echo '"$RESULT"' >> "./'$TEMP_DIR'/'$OUT_FILE'"'
Ini tentu saja menggeneralisasikan hal-hal selain menulis ke file keluaran:
setlock mylockfile sh -c '… interlocked ; stuff …'