Bagaimana menjaga agar cron tidak dicap?

13

Katakanlah saya memiliki beberapa skrip cron yang perlu dijalankan setiap 15 menit. Saya dapat mengatur mereka untuk menjalankan:, */15 * * * *tetapi kemudian mereka semua berjalan pada saat yang sama. Tampaknya konyol bagi server untuk duduk diam selama beberapa menit dan kemudian tiba-tiba mencoba untuk mengeksekusi selusin skrip sekaligus.

Apakah ada cara saya dapat menjalankan satu skrip pada menit 1, 16, 31, 46 dan lainnya pada 2, 17, 32, 47?

Dengan kata lain, saya ingin setiap skrip dijalankan setiap 15 menit, tetapi saya tidak peduli bahwa skrip dijalankan secara khusus pada tanda seperempat jam.

Buttons840
sumber

Jawaban:

7

Anda membuat ini lebih sulit dari yang seharusnya. Letakkan semuanya di baris yang sama, dipisahkan oleh titik koma:

*/15 * * * * command1 ; command 2 ; command 3

Ini akan berjalan command1, tunggu sampai selesai, lalu jalankan command2, tunggu sampai selesai, dan seterusnya.

laebshade
sumber
15

Jika Anda membuat pekerjaan cron Anda terlihat seperti ini: 6-59/15 * * * *maka itu akan berjalan pada 6, 21, 36 dan 51 menit melewati jam.

Ini mungkin tidak bekerja dengan semua versi cron.

Ladadadada
sumber
14

Anda bisa meletakkan semua skrip ke direktori, katakanlah /etc/cron.15m, dan kemudian jalankan cron

*/15 * * * * run-parts /etc/cron.15m

Itu dengan asumsi Anda memiliki run-partsperintah. Setidaknya hadir di semua sistem berbasis Debian. Ini menjalankan semua program yang dapat dieksekusi di direktori bernama, satu per satu dalam urutan daftar.

Kelemahan dari metode ini adalah bahwa jika salah satu script hang, semua yang lain akan menunggu dan tidak dieksekusi. Jika waktu menjalankan semuanya lebih dari 15 menit, maka pekerjaan akan mulai berjalan lagi dan Anda bisa mendapatkan banyak proses yang menumpuk.

Andrew Schulman
sumber
run-partshadir dalam sistem Fedora / Red Hat juga.
mattdm
9

Cara paling mudah untuk melakukan ini adalah hanya dengan mengatur perintah secara manual untuk dijalankan saat Anda menginginkannya:

0,15,30,45 * * * * command0
1,16,31,46 * * * * command1
2,17,32,47 * * * * command2
...
14,29,44,59 * * * * command14

Atau Anda dapat menulis skrip untuk secara otomatis menghasilkan entri crontab yang sesuai (yang menghindari kesalahan ketik).

Beberapa versi cron (mungkin termasuk yang Anda gunakan) menerima sintaks yang diperluas:

0-59/15 * * * * command0
1-59/15 * * * * command1
1-59/15 * * * * command2
...
14-59/15 * * * * command14
Keith Thompson
sumber
0

Cron tidak pandai apa yang Anda coba lakukan. Pernahkah Anda mempertimbangkan untuk menulis skrip yang bertindak sebagai daemon yang pada dasarnya tidur 15 menit, menjalankan perintah, lalu mengulang?

Matt Simmons
sumber
1
Ada beberapa masalah potensial dengan itu. Salah satunya adalah bahwa jika Anda melakukan di sleep 300antara setiap eksekusi perintah, eksekusi perintah itu sendiri akan menyebabkan waktu melayang; mungkin berjalan setiap 15:10 daripada setiap 15:00. Dan jika proses latar belakang mati atau sistem reboot, tidak seperti cronditu, itu tidak akan secara otomatis restart. Ada beberapa cara untuk "daemonisasi" proses latar belakang, tetapi kemudian Anda cukup banyak menerapkan kembali crond.
Keith Thompson
Ya, saya setuju itu bukan solusi yang sempurna (meskipun Anda selalu bisa latar belakang tugas dengan &), tapi begini.
Matt Simmons
1
Sebagai gantinya, cukup jalankan cron script tunggal yang menjalankan semua perintah Anda secara bergantian. Bahkan, itu adalah kebutuhan umum bahwa ada skrip standar yang disebut run-partsyang dikirimkan dengan sebagian besar instalasi cron untuk melakukan itu. Lihat jawaban @ AndrewSchulman.
tylerl
0

Banyak distribusi memiliki /etc/cron.d/cronhourly, untuk itu semua skrip dapat dijalankan setiap jam. Anda bahkan dapat menentukan urutannya dengan memulainya dengan nomor urut, seperti 01scriptA 02scriptB - harus sepele dengan pengetahuan cron yang sudah Anda miliki untuk membuat "cronhourlybyfour" seperti yang kita sebut di distro base linux Smoothwall :)

Kata peringatan: ini menggunakan run-parts seperti yang disarankan sebelumnya, dan run-parts TIDAK suka skrip dengan a. dalam nama, jadi jangan menyebutnya "deletehomefolders.sh" sebut saja "01deletehomefolders" dan pastikan Anda mulai dengan # yang tepat! baris untuk apa pun yang Anda ingin tafsirkan skrip Anda.

Tom Newton
sumber