Crond mengimbangi jadwal lima menit

22

Apakah mungkin untuk mengimbangi set skrip cron untuk dijalankan setiap 5 menit?

Saya memiliki dua skrip, skrip 1 mengumpulkan beberapa data dari satu basis data dan memasukkannya ke yang lain, skrip 2 mengeluarkan data ini dan banyak data lainnya dan membuat beberapa laporan cantik darinya. Kedua skrip harus dijalankan setiap 5 menit. Saya ingin mengimbangi skrip 2 dengan satu menit sehingga dapat membuat laporan dari data baru. EG Saya ingin skrip satu dijalankan pada :00, :05, :10, :15 [...]dan skrip dua dijalankan pada :01, :06, :11, :16 [...]setiap jam. Skrip tidak saling bergantung, dan skrip 2 harus dijalankan terlepas dari apakah skrip satu berhasil atau tidak. Tetapi akan bermanfaat jika laporannya dapat memiliki hte data terbaru. Apakah ini mungkin dengan cron?

Pos;
Saya telah berpikir tentang menggunakan kedua perintah dalam skrip shell sehingga mereka berjalan segera setelah satu sama lain tetapi ini tidak berhasil, kadang-kadang skrip 1 dapat terputus pada menunggu API eksternal dll. Jadi mungkin membutuhkan waktu hingga 15 menit untuk berjalan, tetapi skrip 2 harus dijalankan setiap 5 menit sehingga melakukannya dengan cara ini akan menghentikan / menunda eksekusi skrip 2. Jika saya dapat mengatur ini di Cron, artinya skrip 2 akan berjalan terlepas dari skrip apa yang sedang dilakukan 1

Noda
sumber

Jawaban:

14

Anda dapat menjalankan skrip kapan pun Anda ingin menggunakannya cron. Jika Anda ingin menjalankan skrip 1 setiap 5 menit, Anda mungkin mulai seperti ini:

*/5 * * * * /path/to/script1

Tapi ini sebenarnya hanya singkatan untuk:

0,5,10,15,20,25,30,35,40,45,50,55 * * * * /path/to/script1

Jika Anda ingin menjalankan skrip 2 satu menit setelah skrip 1, Anda dapat melakukan ini:

1,6,11,16,21,26,31,36,41,46,51,56 * * * * /path/to/script2

Anda juga bisa melakukan ini:

*/5 * * * * /path/to/script1
*/5 * * * * /path/to/script2

Dan kemudian pada awal skrip 2, tidur selama satu menit:

sleep 60
larsks
sumber
4
Menempatkan tidur dalam skrip itu sendiri adalah peretasan jelek yang membuat menjalankan skrip dengan tangan dari prompt terasa menyakitkan. Ada cara yang kurang jelek untuk meretasnya dengan membuat bagian sleep dari entri crontab, tetapi cara yang lebih elegan adalah dengan hanya mengimbangi pekerjaan menggunakan notasi crontab yang benar, yang tidak disentuh oleh jawaban Anda.
Caleb
39

Field entri menit untuk crontab menerima operator "increments" yang agak membingungkan karena sepertinya operator itu seharusnya operator "bagi dengan" matematika tetapi tidak. Anda akan paling sering melihatnya menggunakan sesuatu seperti yang berikut ini. Perhatikan bahwa ini tidak menemukan angka yang dapat dibagi lima, melainkan mengambil setiap item kelima dari suatu set:

 */5 * * * * command

Ini memberitahu cron untuk mencocokkan setiap item kelima ( /5) dari set menit 0-59 ( *) tetapi Anda dapat mengubah set seperti ini:

 1-59/5 * * * * command

Ini akan mengambil setiap item kelima dari set 1-59, menjalankan perintah Anda pada menit 6, 11, 16, dll.

Jika Anda membutuhkan lebih banyak offset berbutir halus dari satu menit, Anda dapat meretasnya menggunakan perintah sleep sebagai bagian dari crontab Anda seperti ini:

 */5 * * * * sleep 15 && command

Ini akan menjalankan pekerjaan Anda setiap lima menit, tetapi perintah itu tidak akan benar-benar dimulai sampai 15 detik setelah menit. Untuk pekerjaan yang berjalan singkat di mana berada beberapa detik setelah sesuatu yang lain membuat perbedaan tetapi Anda tidak ingin terlambat satu menit penuh, ini adalah hack yang cukup sederhana.

Caleb
sumber
1
Ini adalah jawaban yang lebih baik daripada yang diterima. Mengatur offset melalui rentang jauh lebih bersih daripada tidur.
ND Geek
11

Anda dapat menunjukkan offset waktu dengan simbol +. Misalnya, untuk dijalankan pada :01, :06, :11, :16 [...], buat tugas seperti

*/5+1 * * * * command
Kurt
sumber
7
Ini sepertinya tidak berfungsi di beberapa versi cron
jhoff
1
Versi cron mana yang Anda gunakan yang mendukung sintaks ini? Cronie tampaknya tidak mendukungnya.
Matthew G
Saya memiliki Cronie di CentOS7, jadi saya tidak akan mencoba solusi ini terlebih dahulu.
AnneTheAgile
1

Ini bekerja untuk saya:

1/5 * ? * * *

Di mana 1 adalah menit offset. Jadi, jika Anda ingin mengimbangi tiga menit:

3/5 * ? * * *

Saya memiliki ini berfungsi dalam pengaturan jadwal AWS

Zymotik
sumber