Jalankan beberapa pekerjaan cron di mana satu pekerjaan membutuhkan waktu yang lama

16

Saya punya pertanyaan umum berikut tentang pekerjaan cron.

Misalkan saya memiliki yang berikut di crontab:

* 10 * * * * someScript.sh
* 11 * * * * someScript2.sh
30 11 */2 * * someScript3.sh  <-- Takes a long time let's say 36 hours.
* 12 * * * someScript4.sh

Apakah cukup pintar untuk menjalankan pekerjaan yang tersisa pada waktu yang tepat? Misalnya, skrip panjang tidak perlu dihentikan?

Juga, apa yang terjadi jika skrip panjang awal masih berjalan dan dipanggil oleh cron lagi?

Terima kasih!

pengguna1357015
sumber
Cron tidak peduli berapa lama pekerjaan itu dijalankan; itu akan menjalankan salinan tambahan.
Jeff Schaller
Harap pastikan pertanyaan Anda diformat dengan benar.
Bram

Jawaban:

31

Setiap pekerjaan cron dijalankan secara independen dari pekerjaan lain yang mungkin telah Anda tentukan. Ini berarti bahwa skrip Anda yang berumur panjang tidak akan menghalangi pekerjaan lain dari dieksekusi pada waktu yang ditentukan.

Jika ada skrip Anda yang masih dieksekusi pada interval cron terjadwal berikutnya, maka contoh skrip Anda yang bersamaan akan dijalankan.

Ini dapat memiliki konsekuensi yang tidak terduga tergantung pada apa yang dilakukan skrip Anda. Saya akan merekomendasikan membaca artikel Wikipedia tentang Penguncian File , khususnya bagian tentang file Kunci . File kunci adalah mekanisme sederhana untuk memberi sinyal bahwa sumber daya - dalam kasus Anda someScript3.shskrip - saat ini 'dikunci' (yaitu sedang digunakan) dan tidak boleh dieksekusi lagi sampai file kunci dihapus.

Lihatlah jawaban atas pertanyaan berikut untuk detail cara menerapkan file kunci dalam skrip Anda:

kue jiwa
sumber
8

Tidak yakin apa yang Anda maksud dengan waktu yang tepat. Cron akan memulai pekerjaan pada waktu yang dijadwalkan untuk melakukannya. Itu tidak memeriksa pekerjaan terjadwal lainnya atau contoh pekerjaan lain.

Jadi, apa pun pekerjaan valid yang Anda tetapkan akan dimulai pada waktu yang ditentukan. Pekerjaan apa pun yang berjalan lebih lama dari interval yang ditentukan akan dimulai beberapa kali. Ini adalah tanggung jawab siapa pun yang menulis pekerjaan untuk mencegahnya benar-benar berjalan beberapa kali jika itu diperlukan. Dengan misalnya memeriksa file kunci atau file PID atau sesuatu.

Ada batasan yang jelas untuk jumlah proses yang dapat berjalan secara paralel tetapi itu tidak spesifik cron.

Bram
sumber
6

Selain jawaban lain, terutama tautan yang diposting oleh @soulcake: Jika Anda menjadwalkan perintah yang berjalan lama dengan interval yang terlalu pendek, cron akan dengan senang hati mengeksekusi yang kedua sebelum yang pertama selesai (kecuali jika ada semacam mutex yang diterapkan dalam perintah) .

Itu sering memperlambat perintah asli lebih jauh, mengarah ke contoh lain dijalankan sebelum yang sebelumnya selesai, dll. Atau mungkin tidak diinginkan karena alasan lain.

Cara umum untuk mencegah adalah mengkondisikan menjalankan perintah dengan penjaga yang memastikan bahwa perintah sebelumnya tidak berjalan. Sebagai contoh:

10 * * * * pgrep my_slow_command >/dev/null || /usr/local/bin/my_slow_command

Pastikan pgrep cocok dengan nama perintah ketika dijalankan, misal skrip python memiliki python sebagai nama yang dapat dieksekusi, yang mungkin tidak cukup spesifik dan Anda harus mencocokkan dengan nama skrip python juga.

10 * * * * pgrep -f my_script.py || /usr/local/bin/my_script.py

(pgrep tanpa opsi '-f' cocok dengan nama skrip bash,)

Jika Anda tidak dapat menggunakan pgrep karena beberapa alasan:

10 * * * * ps ax | grep [m]y_command || /usr/local/bin/my_command

Tanda kurung digunakan untuk menghindari pencocokan perintah grep itu sendiri.

Edheldil
sumber
0

Saya menggunakan flock.

* * * * * exec flock --nonblock .ws_client.lock -c ws_client.py >& /tmp/ws_client.out
JohnMudd
sumber