Saya ingin memiliki file yang digunakan sebagai penghitung. Pengguna A akan menulis dan menambah nomor ini, sementara Pengguna B meminta untuk membaca file. Mungkinkah Pengguna A dapat mengunci file ini sehingga tidak ada yang dapat membaca atau menulis padanya sampai penulisan Pengguna A selesai?
Saya telah melihat ke dalam flock
tetapi tampaknya tidak bisa membuatnya berfungsi seperti yang saya harapkan.
flock -x -w 5 /dev/shm/counter.txt echo "4" > /dev/shm/counter.txt && sleep 5
Jika ada cara yang lebih tepat untuk mendapatkan file peningkatan atom-seperti ini, itu akan sangat menyenangkan untuk didengar juga!
Cita-cita saya adalah:
LOCK counter.txt; write to counter.txt;
sementara pada waktu yang sama
Read counter.txt; realize it's locked so wait until that lock is finished.
shell
shell-script
lock
d -_- b
sumber
sumber
&& sleep 5
dieksekusi setelah kawanan melepaskan kunci.)flock
, tetapi saya akan menempatkan itu sebagai pertanyaan terpisah. John terima kasih!Jawaban:
Pemrosesan Bash atas perintah di bawah ini mungkin mengejutkan:
Bash pertama kali berjalan
flock -x -w 5 /dev/shm/counter.txt echo "4" > /dev/shm/counter.txt
dan, jika itu berhasil (melepaskan kunci), maka berjalansleep 5
. Dengan demikian, kunci tidak ditahan selama 5 detik yang mungkin diharapkan.Selain
&
lawan&&
Jika seseorang memiliki dua perintah,
A
danB
, maka:A & B
dimulaiA
di latar belakang dan kemudian mulaiB
tanpa menunggu untukA
selesai.A && B
dimulaiA
, tunggu sampai selesai, dan kemudian, jika selesai dengan sukses (kode keluar 0), dimulaiB
. JikaA
gagal (kode keluar bukan nol), makaB
tidak pernah dijalankan.Singkatnya,
&
dan&&
dua operator daftar yang sama sekali berbeda.sumber
A && B
,A
akan menungguB
sampai selesai.Kunci file tidak wajib 1 - yaitu, Anda tidak dapat mengunci file sehingga proses lain tidak dapat mengaksesnya. Mengunci file berarti bahwa jika proses (nother) memeriksa untuk melihat apakah telah dikunci, ia akan tahu.
Tujuannya
flock
adalah untuk melakukan hal-hal seperti apa yang Anda inginkan, tetapi Anda kemudian harus menggunakannyaflock
untuk setiap dan setiap upaya akses . Ingatlah bahwa itu memblokir panggilan; dariman flock
:1. Yang membuat fitur tersebut tampak tidak berguna jika Anda menggunakannya untuk, misalnya, keamanan, tetapi itu bukan tujuan dari kunci file - mereka untuk sinkronisasi, yang adalah apa yang Anda lakukan. Pengguna Leo menunjukkan bahwa mungkin ada implementasi non-standar penguncian file wajib di kernel linux ( lihat diskusi ini ), berdasarkan paralel sejarah dari sistem operasi * nix lainnya. Namun, ini tampaknya hanya antarmuka tingkat C.
sumber
flock
setiap waktu. sangat membantu!Anda bisa menggunakan "perintah sh -c ..." untuk menjalankan seluruh perintah shell, termasuk pengalihan file, dengan kunci dipegang. Juga, karena Anda menggunakan file sebagai penghitung, Anda harus menahan kunci terus menerus saat Anda membaca dan menulis kembali. Jadi, Anda ingin melakukan sesuatu seperti ini untuk meningkatkan penghitung dan mengembalikan nilai baru:
Mengubah tanda plus ke tanda minus harus mengurangi penghitung:
Saya berharap Anda akan menginisialisasi konter sebelum pertikaian apa pun dapat terjadi, jadi tidak perlu khawatir tentang mengunci itu lebih awal:
Saya tidak berpikir Anda perlu mengalahkan nilai penghitung sementara pertikaian bisa terjadi, tetapi, jika pernah melakukannya, Anda harus melakukannya dengan demikian:
Saya pikir Anda mengerti cara membaca, tetapi saya memasukkannya untuk kelengkapan:
sumber