Adakah yang bisa menjelaskan cara menggunakan flock dan deskriptor file untuk mengunci file dan menulis ke file yang terkunci?

14

Telanjang dengan saya karena saya baru dengan flockalat ini dan saya belum menggunakan deskriptor file sejauh yang saya tahu.

Saya memiliki skrip bash yang membuat permintaan CURL dan menulis output ke file bernama resp.txt. Saya perlu membuat kunci eksklusif sehingga saya bisa menulis ke file itu dan tidak khawatir tentang beberapa pengguna yang menjalankan skrip dan mengedit file teks pada saat yang sama.

Berikut adalah kode yang saya harapkan untuk mengunci file, melakukan permintaan, dan menulis ke file teks:

(
flock -e 200
curl 'someurl' -H 'someHeader' > resp.txt
) 200>/home/user/ITS/resp.txt

Apakah ini cara yang benar untuk melakukan ini? Skrip saya yang sebenarnya sedikit lebih lama dari ini, tetapi tampaknya rusak ketika saya menambahkan flocksintaks ke skrip bash.

Jika seseorang dapat menjelaskan cara kerja deskriptor file ini dan beri tahu saya jika saya mengunci file dengan benar, itu akan luar biasa!

DuckPuncher
sumber

Jawaban:

8

Ini tidak benar karena ketika Anda melakukannya ( flock -e 200; ... ) 200> file, Anda memotong file file sebelum Anda mendapatkan kunci eksklusif. Saya pikir Anda harus melakukan:

touch resp.txt
(
  flock -e 200
  curl 'someurl' -H 'someHeader' > resp.txt
) 200< resp.txt

untuk menempatkan kunci pada file yang dibuka sebagai hanya baca.

Catatan. Beberapa shell tidak mendukung deskriptor file yang lebih besar dari 9. Selain itu deskriptor file hardcoded mungkin sudah digunakan. Dengan shell canggih (bash, ksh93, zsh), berikut ini dapat dilakukan:

touch resp.txt
(
  unset foo
  exec {foo}< resp.txt
  flock -e $foo
  curl 'someurl' -H 'someHeader' > resp.txt
)
vinc17
sumber
Saya perlu perintah curl akan menulis ke file sekalipun. Apakah saya salah mengerti bagaimana cara flockkerjanya? Saya baru
mengenal
1
@DuckPuncher Mekanisme kunci terpisah dari operasi baca / tulis yang dapat Anda lakukan pada file. Jadi, curlmasih bisa menulis ke file. Perhatikan bahwa ini mungkin tidak aman (atau bahkan tidak berfungsi) dengan NFS, tetapi jangan gunakan skrip shell untuk mengunci file melalui NFS. Dengan bash, Anda juga dapat membuka file untuk membaca dan menulis: 200<> resp.txttetapi ini seharusnya tidak mengubah apa pun.
vinc17