Apakah ada cara untuk menjalankan skrip setiap menit (atau 2, atau 5, dll), tetapi hanya jika skrip belum berjalan?
Kami memiliki serangkaian skrip yang perlu dijalankan setiap menit. Kadang-kadang mereka mungkin mulai dan selesai dalam sedetik, di lain waktu mereka mungkin berjalan selama 5 menit.
Cara kami saat ini untuk menghindari eksekusi simultan adalah dengan menetapkan is_running
bendera di setiap skrip, dan keluar jika masih diaktifkan. Tapi ini sedikit tidak bisa diandalkan (yaitu, kesalahan fatal akan menyebabkan bendera tetap diaktifkan bahkan setelah skrip dihentikan).
Kita bisa menulis manajer kecil kita sendiri, tetapi saya bertanya-tanya apakah ada solusi yang lebih modis yang sudah ada.
Jawaban:
cara yang lebih baik adalah menggunakan
flock
alih-alih pidfile. periksa halaman manual: flock (1) . Keuntungannya adalah tidak peduli bagaimana proses selesai / mati, kuncinya tetap ada.sumber
Saya cenderung setuju dengan jawaban file pid Warner. Namun, apakah fitur Anacron berikut menyelesaikan ini?
Saya belum mengujinya sendiri, saya tidak menemukan dokumentasi anacron cukup menyeluruh ...
Jika Anda ingin menjadi sangat malas ;-) Anda hanya dapat memiliki skrip keluar jika memahami keluaran ps mengembalikan proses sebagai berjalan. Tetapi file kunci / pid adalah yang terbaik.
sumber
anacron
dan apa yangcron
dilakukan, tetapi mereka memecahkan masalah yang berbeda. Dengan menggunakancron
, bagaimana Anda memulai pekerjaan yang tidak terjawab karena mesin mati? Dengan menggunakananacron
, bagaimana Anda memulai pekerjaan setiap 25 Desember atau setiap 5 menit? (Tentu saja, Anda dapat memecahkan masalah skrip, tapi bukan itu yang saya bicarakan.)anacron
tidak berjalan pada periode yang lebih pendek dari satu hari.Itu solusi yang tepat untuk pendekatan itu. Biasanya, file pid akan digunakan dan tes pid akan dilakukan terhadap proses untuk memastikan itu berjalan. Jika basi, file kunci akan dihapus dan proses akan tetap berjalan.
Setiap kecerdasan tambahan biasanya akan ditulis dalam perangkat lunak itu sendiri, sebagai daemon, sebagai lawan berjalan di cron.
sumber
Jika skrip Anda dikodekan dalam bahasa yang mendukung syscall flock (2), maka Anda bisa flock () file kunci dengan panggilan fungsi juga. Contoh:
Jika Anda terjebak dengan Bash atau bahasa skrip lain yang tidak mendukung ini, solusi yang sudah diajukan dengan flock (1) juga baik-baik saja.
PS Dalam hal apa pun, Anda harus membuat file kunci yang terpisah hanya sekali (jika belum ada), dan jangan pernah menghapusnya. Direktori "/ var / lock" adalah tempat yang baik untuk file seperti itu.
sumber
Ini adalah solusi jika skrip Anda berjalan dalam python (atau Anda dapat membuat perintah python untuk dijalankan sebelum perintah berikutnya) - Saya mengalami masalah yang sama minggu lalu, dan meskipun saya menemukan beberapa solusi yang baik, saya memutuskan untuk membuat sangat paket python sederhana dan bersih dan mengunggahnya ke PyPI. Anda pasti bisa mengunci
__file__
agar tidak perlu berpikir untuk memberinya nama sumber daya khusus untuk dikunci.Instal dengan:
pip install quicklock
Menggunakannya sangat sederhana:
Lihatlah: https://pypi.python.org/pypi/quicklock
sumber