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.
sumber
[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?flock
ataurun-one
(Debian / Ubuntu)? serverfault.com/questions/82857/…Jawaban:
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
flock
utilitas untuk mengelola file kunci secara semi-otomatis.Jika Anda tidak / tidak bisa bergantung pada mekanisme penguncian apa pun, masalah sederhana a
service crond stop
untuk mematikancrond
sistem.sumber
flock
perintah akan menjadi tambahan yang bagus untuk jawaban ini. Ini menangani file kunci dan semua detail kecil ada untuk itu.flock
deskriptor 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.Saya cenderung untuk hanya membungkus semua perintah yang berjalan lama di layar dan
cron
memulai layar hanya jika tidak ada yang sudah berjalan.Jadi baris berikut di
crontab
... berubah menjadi sesuatu seperti ini:
Saya suka ini karena juga memberi Anda kesempatan untuk melampirkan skrip yang sedang berjalan dan memeriksa output / statusnya.
Dalam skenario Anda, Anda bisa
cron
memeriksa layar lain sebelum menjalankan build, misalnyaSaat Anda menjalankan pembuatan manual, langsung saja lakukan
screen
skrip terlebih dahulu sebelum Anda menjalankan skrip (beri komentar jika Anda memerlukan petunjuk bagaimana cara menyambungkan / memutuskan sambunganscreen
. 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
cron
jika Anda memiliki lebih dari 1 sesi layar dengan nama "ManualBuild" berjalan.sumber
screen -x ScreenName
dan tergantung pada distro Anda (pengaturan suid untukscreen
) 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.