Setelah melalui dokumentasi bash , pertanyaan ini dan yang ini masih belum jelas bagi saya bagaimana saya bisa melakukan operasi penulisan atom (tambahkan) ke file dalam bash. Saya memiliki skrip yang dijalankan dalam beberapa kasus dan pada beberapa titik harus menulis data ke file:
echo "$RESULT" >> `pwd`/$TEMP_DIR/$OUT_FILE
Bagaimana mungkin membuat semua operasi penulisan dari semua skrip yang berjalan bersamaan ke file atomic (sehingga data dari satu instance tidak tumpang tindih data dari yang lain)?
linux
bash
command-line
semaphore
Sebi
sumber
sumber
`pwd`
; Anda bisa menggunakan titik (.
). Anda juga harus mengutip seluruh nama file karena menyertakan variabel .pwd
skrip sebelumnya untuk memberi tahu pengguna tentang direktori kerja saat ini dan juga menulis entri dalam file log. melihat-lihat FIFO sekarang.mkfifo
dan bukan tingkat pengantar yang sebenarnya.Jawaban:
Tampaknya Anda perlu menggunakan
flock
seperti pada contoh dari man ( http://linux.die.net/man/1/flock )Dan letakkan semua perintah Anda yang harus berupa atom di ().
sumber
/var/lock/mylockfile
tersedia untuk mengunci./var/lock/mylockfile
oleh proses yang disebutflock -x
?(flock -x 200; date; sleep 10; date;) 200>/var/lock/mylockfile
dalam dua shell dan melihat bahwa membuka kunci hanya terjadi setelah semua perintah di () dieksekusi (yang dalam subkulit)flock
adalah salah satu cara operasi yang saling terkait. Utilitas adalah bagian dari tool util-linux dan hanya tersedia untuk Linux. Utilitas lain, tersedia di berbagai platform yang lebih luas, didasarkan padasetlock
utilitas Daniel J. Bernstein dari paket daemontools:setlock
dari daemontoolssetlock
dari daemontools-encore Bruce Guenters6-setlock
dari Laurent Bercot's s6chpst
dari runit Gerrit Paperunlock
dari pelakunya Wayne Marshallsetlock
dari nosh toolset sayaAlat-alat ini beroperasi dengan paradigma yang sedikit berbeda dengan yang digunakan dalam jawaban M. Kurenkov (salah satunya)
flock
juga dapat digunakan, tetapi tidak dalam jawaban itu). Satu memanggilsetlock
program untuk memuat rantai ke perintah yang harus saling bertautan.setlock
itu sendiri membuka dan mengunci file kunci, dan meninggalkan deskriptor file untuk itu terbuka dalam prosesnya. Kunci tetap ada selama proses itu berlangsung (kecuali perintah berikutnya dirantai untuk secara eksplisit melepaskan kunci dengan menemukan dan menutup deskriptor file terbuka).Untuk kasus dalam pertanyaan, seseorang harus mengaitkan perintah yang menghasilkan garis keluaran, dengan menyadari bahwa ini memanggil sebuah eksternal
echo
sebagai pengganti shell bawaanecho
:Dalam hal ini tidak perlu saling mengunci membuka file output dalam mode append. Jika ya, seseorang harus membuka file itu di dalam kunci, yang mengharuskan baik menggunakan program seperti
yang mana dapat berubah menjadi fungsi shell jika diinginkan: atau bertahan dengan 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:fdredir
/redirfd
:Ini tentu saja menggeneralisasi hal-hal selain menulis ke file output:
sumber