Apakah ada pola yang ditetapkan untuk memasang sakelar kill atau on / off untuk pekerjaan cron pengguna?

8

Kami memiliki bangunan agak panjang yang biasanya kami jadwalkan pekerjaan cron kami, tetapi kadang-kadang kami harus menjalankan ulang bangunan selama jangka waktu non-standar dan dapat mengalami konflik dengan pekerjaan cron yang biasanya aman untuk dijalankan pada saat itu.

Kami memiliki beberapa akun yang menjalankan pekerjaan build dan cron, jadi kami tidak dapat menangguhkan layanan crontab untuk seluruh mesin dan kemudian memulai kembali nanti.

Saya bertanya-tanya apakah ada yang punya pola atau implementasi. Saya membayangkan ini bekerja seperti

Pengguna membuat file: ~ / block-crontab
pengguna menjalankan build. Pekerjaan cron mencari file itu di direktori home dari pengguna dan jika hanya ada lompati semua pekerjaan cron. Kalau tidak, ia menjalankan pekerjaan. Kemudian ketika build selesai, pengguna menghapus ~ / block-crontab

Apakah itu akan berhasil? Saya kira saya perlu memodifikasi skrip cron. Saya kebanyakan bertanya-tanya apakah ada pendekatan yang lebih baik / standar untuk masalah ini?

Terima kasih.

Sean
sumber
Apa maksudmu [the build] can run into conflicts with from jobs that are tipically safe to run at those times? Apakah ada pekerjaan non-build yang tidak dapat dijalankan selama build? Apakah semua pekerjaan saling eksklusif satu sama lain? Atau hanya tentang membangun?
GnP
1
Sudahkah Anda melihat intro flockatau run-one(Debian / Ubuntu)? serverfault.com/questions/82857/…
Stefan Lasiewski
Sebagai contoh, kami menjalankan pembaruan db besar setiap pagi. Kemudian setiap jam sampai sore kami menyegarkan halaman depan dengan berita atau item acak. Jika dijalankan selama pembaruan db, halaman depan mungkin memiliki beberapa elemen yang hilang.
Sean
Belum melihat kawanan atau lari-satu. Terima kasih.
Sean

Jawaban:

10

Daripada mengacaukan crond, saya sangat menyarankan untuk menerapkan beberapa bentuk penguncian (bahkan sederhana) di dalam skrip build Anda. Misalnya, sentuh dan periksa file di /var/run/: jika skrip Anda menemukan sesuatu, daripada proses lain yang membangun proyek. Anda jelas perlu menghapus file kunci saat selesai.

Seperti yang dicatat oleh @GnP dalam komentar, Anda juga dapat menggunakan flockutilitas untuk mengelola file kunci secara semi-otomatis.

Jika Anda tidak / tidak bisa bergantung pada mekanisme penguncian apa pun, masalah sederhana a service crond stopuntuk mematikan crondsistem.

shodanshok
sumber
2
The flockperintah akan menjadi tambahan yang bagus untuk jawaban ini. Ini menangani file kunci dan semua detail kecil ada untuk itu.
GnP
@ GMP Saran yang bagus! Saya telah memperbarui jawaban saya
shodanshok
1
Perlu diketahui bahwa flockdeskriptor file diwarisi dengan proses anak kecuali jika Anda membuat beberapa langkah untuk menutupnya. Itu kadang-kadang dapat menyebabkan perilaku yang tidak terduga terutama jika orang memulai 'pekerjaan latar belakang' yang dieksekusi di cron.
Matthew Ife
1

Saya cenderung untuk hanya membungkus semua perintah yang berjalan lama di layar dan cronmemulai layar hanya jika tidak ada yang sudah berjalan.

Jadi baris berikut di crontab

*/2 * * * *  /bin/bash /path/to/LongRunningScript.bash

... berubah menjadi sesuatu seperti ini:

*/2 * * * *  /usr/bin/screen -S MyUniqueName -Q select . || /usr/bin/screen -dmS MyUniqueName /bin/bash /path/to/LongRunningScript.bash

Saya suka ini karena juga memberi Anda kesempatan untuk melampirkan skrip yang sedang berjalan dan memeriksa output / statusnya.

Dalam skenario Anda, Anda bisa cronmemeriksa layar lain sebelum menjalankan build, misalnya

0 3 * * *  /usr/bin/screen -S ManualBuild -Q select . || /usr/bin/screen -dmS AutomatedBuild /bin/bash /path/to/BuildScripts.bash
10 3 * * *  /usr/bin/screen -S ManualBuild -Q select . || /usr/bin/screen -dmS OtherAutomatedBuild /bin/bash /path/to/OtherBuildScripts.bash

Saat Anda menjalankan pembuatan manual, langsung saja lakukan screenskrip terlebih dahulu sebelum Anda menjalankan skrip (beri komentar jika Anda memerlukan petunjuk bagaimana cara menyambungkan / memutuskan sambungan screen. Ini adalah utilitas yang berguna - coba coba jika Anda belum mulai menggunakannya)

Ketik screen -S ManualBuild, tekan [enter]dan jalankan perintah apa pun yang ingin Anda jalankan.

Catatan: Jika Anda menggunakan contoh seperti yang disediakan, Anda mungkin bingung cronjika Anda memiliki lebih dari 1 sesi layar dengan nama "ManualBuild" berjalan.

trs
sumber
Maaf, lihat saja catatan "lintas banyak pengguna" - ini tidak akan berfungsi di seluruh pengguna tanpa modifikasi. Perlu memeriksa apakah layar mendukung koneksi ke sesi pengguna lain.
trs
itu ide yang bagus. Saya harus menghentikan kebiasaan para devs meninggalkan jendela jangka mereka terbuka selama berbulan-bulan pada suatu waktu. :)
Sean
Jika mereka membiarkan sesi mereka terbuka, Anda dapat melampirkan ke layar terlampir dengan screen -x ScreenNamedan tergantung pada distro Anda (pengaturan suid untuk screen) Anda dapat membuat sesi layar dapat dibagikan kepada pengguna lain. Cara terbersih adalah dengan menjalankan perintah build ini di bawah nama pengguna tertentu, saya kira, pengguna yang sama yang memiliki pekerjaan cron.
trs