Saya ingin menjalankan beberapa skrip Bash shell secara paralel. Namun, saya ingin menghindari kondisi balapan. Apa perintah Unix yang benar - benar atom yang bisa saya gunakan untuk tujuan ini, dan bagaimana saya bisa menggunakannya?
34
make(1)
untuk mengambil alih? (Yaitu, lakukanmake -j 9
jika Anda memiliki 8 core)? Ini memiliki keuntungan tambahan dari pekerjaan interleaving dengan granularity yang lebih halus.Jawaban:
Jika
lockfile
tidak diinstal pada sistem Anda, makamkdir
akan melakukan pekerjaan: ini adalah operasi atom, dan gagal jika direktori sudah ada (selama Anda tidak menambahkan-p
saklar baris perintah).sumber
flock(1)
Ini memastikan bahwa kode antara "(" dan ")" dijalankan hanya oleh satu proses pada satu waktu dan bahwa proses menunggu kunci terlalu lama.
sumber
lockf(1)
.lockf(1)
tidak bekerja dengan cara yang digunakan dalam contoh ini. Tidak dapat menggunakan nomor deskriptor file sebagai argumen.lockfile (1) terlihat seperti kandidat yang baik, namun berhati-hatilah bahwa itu adalah bagian dari paket procmail , yang mungkin belum Anda instal pada mesin Anda. Ini adalah paket yang cukup populer sehingga harus dikemas untuk sistem Anda jika belum diinstal. Tiga dari empat sistem yang saya periksa memilikinya, dan yang lainnya memilikinya.
Penggunaannya sederhana:
Opsi yang saya berikan membuatnya coba lagi satu detik selama 15 detik. Jatuhkan bendera "-r" jika Anda ingin menunggu selamanya.
sumber
Panggilan sistem
mkdir()
bersifat atom pada sistem file POSIX. Jadi, menggunakanmkdir
perintah sedemikian rupa sehingga hanya melibatkan satu panggilan untukmkdir()
mencapai tujuan Anda. (TKI, jangan gunakanmkdir -p
). Buka kunci yang sesuairmdir
tentu saja.Caveat emptor:
mkdir()
mungkin bukan atom pada sistem file jaringan.sumber
rmdir
karena itu juga atom?Mungkin perintah lockfile akan melakukan apa yang Anda butuhkan.
sumber
Jika Anda hanya menjalankan Unix, gunakan fifos. Anda dapat menulis catatan kerja ke fifo dan meminta proses membaca dari file ini dan pembaca Anda akan memblokir fifos.
File kunci tidak masalah, tetapi untuk apa yang Anda jelaskan saya akan menggunakan fifos
sumber
Seperti yang diposting di sini: " Mengunci yang benar dalam skrip shell? ", Menggunakan alat FLOM (Free LOck Manager) , membuat serialisasi perintah dan skrip shell menjadi semudah menjalankan
FLOM memungkinkan Anda untuk menerapkan kasus penggunaan yang lebih lunak (penguncian terdistribusi, pembaca / penulis, sumber daya numerik, dll ...) seperti yang dijelaskan di sini: http://sourceforge.net/p/flom/wiki/FLOM%20by%20examples/
sumber