Lewati beberapa perintah untuk berkumpul

11
flock -x -w 5 ~/counter.txt 'COUNTER=$(cat ~/counter.txt); echo $((COUNTER + 1)) > ~/counter.txt'

Bagaimana saya meneruskan beberapa perintah flockseperti pada contoh di atas?

Sejauh yang saya mengerti, flockmengambil bendera yang berbeda (-x untuk eksklusif, -w untuk batas waktu), kemudian file untuk mengunci, dan kemudian perintah untuk menjalankan. Saya tidak yakin bagaimana saya akan meneruskan dua perintah ke fungsi ini (setel variabel dengan konten file yang dikunci, dan kemudian tambahkan file ini).

Tujuan saya di sini adalah untuk membuat selisih atom untuk file dengan menguncinya setiap kali skrip mencoba mengakses counter.txtfile.

d -_- b
sumber

Jawaban:

7

Gunakan shell secara eksplisit.

flock -x -w 5 ~/counter.txt sh -c 'COUNTER=$(cat counter.txt); echo $((COUNTER + 1)) > ~/counter.txt'

Perhatikan bahwa variabel apa pun yang Anda ubah adalah lokal ke instance shell itu. Misalnya, COUNTERvariabel tidak akan diperbarui dalam skrip panggilan: Anda harus membacanya kembali dari file (tetapi sementara itu mungkin telah berubah), atau sebagai output dari perintah:

new_counter=$(flock -x -w 5 ~/counter.txt sh -c 'COUNTER=$(cat counter.txt); echo $((COUNTER + 1)) | tee ~/counter.txt')
Gilles 'SANGAT berhenti menjadi jahat'
sumber
luar biasa, terima kasih banyak! Penjelasan yang Anda berikan pasti menyelamatkan saya dari sakit kepala selama satu jam lagi
d -_- b
4

Atau Anda dapat menggumpal deskriptor file

exec {counterfd}<~/counter.txt
flock -x -w 5 "$counterfd"
COUNTER=$(cat ~/counter.txt)
COUNTER=$(( COUNTER +1 ))
echo "$COUNTER" >~/counter.txt
exec {counterfd}<&-

Ini juga memiliki manfaat memungkinkan Anda untuk menggunakan variabel counter secara langsung, tidak seperti pendekatan berbasis subkulit.

Richard Maw
sumber
Tolong jelaskan exec {counterfd}? Sendiri, kesalahan Debian not found, tetapi mengembalikan 0 dengan redirection. Sangat aneh.
Steve Almond
2

The flockalat ini sedikit rumit untuk menggunakan dan halaman manual cukup singkat. Halaman manual menyediakan tiga cara untuk menggunakan alat:

  • flock [options] <file|directory> <command> [command args]
  • flock [options] <file|directory> -c <command>
  • flock [options] <file descriptor number>

Cara pertanyaan ini diucapkan saya pasti akan menggunakan bentuk ketiga flock. Jika Anda masuk lebih jauh di halaman manual karena flockada beberapa contoh yang menunjukkan sintaks yang tepat untuk menggunakan formulir ketiga:

#!/bin/bash
(
 flock -n 9 || exit 1
 echo "commands executed under lock..."
 echo "go here..."
) 9>/tmp/mylockfile

Saya menambahkan #!/bin/bash.

Saya telah berhasil menggunakan bentuk flock.

Trevor Boyd Smith
sumber