GNU/Linux >> Belajar Linux >  >> Linux

Melakukan operasi tulis atom dalam file di bash

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 daemontools
  • setlock dari daemontools-encore
  • milik Bruce Guenter
  • s6-setlock dari s6 Laurent Bercot
  • chpst dari runit Gerrit Pape
  • runlock dari pelaku Wayne Marshall
  • setlock 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]" ; }
[…]
outfile echo "$RESULT"
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:

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 …'


Linux
  1. Bisakah Skrip Bash Dihubungkan ke File?

  2. Basa'?

  3. Melakukan Operasi Tulis Atom Dalam File Di Bash?

  1. Apakah Mv Atomic Di Fs?

  2. Tulis Semua Tmux Scrollback Ke File?

  3. Perbarui Riwayat Bash Di Terminal Lain Saat Keluar dari Satu Terminal?

  1. Cara menulis loop di Bash

  2. Tulis ke file .txt?

  3. Shell - Tulis konten variabel ke file