Jawaban:
Perintah di crontab dijalankan dengan /bin/sh
sehingga Anda dapat menggunakan ekspansi aritmatika untuk menghitung apakah modulo menit saat ini sama dengan nol:
*/5 * * * * [ $(( $(date +\%s) / 60 \% 25 )) -eq 0 ] && your_command
cron
akan menjalankan seluruh entri ini setiap 5 menit, tetapi hanya jika menit saat ini (dalam menit sejak zaman) modulo 25 sama dengan nol akan berjalan your_command
.
Seperti yang telah ditunjukkan orang lain, 1 hari tidak habis dibagi 25 menit, jadi ini tidak akan menyebabkan your_command
berjalan pada waktu yang sama setiap hari, tetapi akan berjalan setiap 25 menit.
Taruhan terbaik Anda adalah berjalan pada 20 menit atau 30 menit.
Berikutnya Anda mungkin memicu setiap 5 menit, dan kemudian menghitung jumlah internal atau timestamp, dan menjalankan setiap pemicu 5, atau jika 25 menit telah berlalu sejak menjalankan terakhir.
Yang lebih rumit adalah menentukan waktu yang tepat untuk sehari, mulai dari tengah malam, dan menerima kesalahan di akhir hari. Ini akan melibatkan duplikasi entri crontab ke jam yang berbeda.
Lebih rumit dari itu adalah untuk menghitung waktu selama satu bulan penuh, yang akan melibatkan banyak salinan entri crontab untuk mencakup berbagai kombinasi.
Akhirnya Anda bisa menerapkan sendiri selalu pada daemon, dan minta agar melakukan penjadwalan.
Saya tidak punya pengalaman langsung dengan itu, tetapi fcron tampaknya melakukan apa yang Anda inginkan di luar kotak. Menurut dokumentasinya, Anda dapat menentukan frekuensi:
# Get our mails every 30 minutes
@ 30 getmails -all
# make some security tests every 48 hours of system up time,
# force a mail to be sent to root even if there is no output
@mailto(root),forcemail 2d /etc/security/msec/cron-sh/security.sh
@ 25 command
harus melakukan trik.
Izinkan saya menjelaskan secara singkat apa masalahnya di sini. Memasukkan 25 dalam bidang menit menyebabkan cron
untuk mengeksekusi ketika menit waktu saat ini sama dengan 25, yaitu satu jam sekali. Anda dapat memasukkan daftar kecocokan, masalahnya adalah 60 (menit dalam satu jam) tidak dapat dibagi dengan 25, jadi Anda perlu menambahkan beberapa entri berdasarkan jam. Kelipatan paling tidak umum dari 60 & 25 adalah 300, yaitu 5 * 60. jadi Anda harus menggilir 5 jam sampai kembali ke awal semula. sebagai contoh:
0, 25, 50
15, 40
5, 30, 55
20, 45
10, 35
...
Tapi di sini lagi, 24 (jam sehari) tidak dapat dibagi dengan 5, kelipatan paling umum dari 5 & 24 hanyalah 5 * 24 = 120. & seterusnya dan seterusnya ...
Anda dapat bermain dengan waktu modifikasi terakhir file
Buat skrip kecil (misalnya /usr/local/bin/age
) yang akan menampilkan usia file:
#bin/sh
echo $(( $( date +%s ) - $( stat -c %Z $1 ) ))
Crontab Anda akan terlihat seperti ini (dengan asumsi 25 menit sama dengan 1500 detik jika saya benar)
* * * * * [ $(/usr/local/bin/fileage /var/tmp/your_command.offset) -gt 1500 ] && touch /var/tmp/your_command.offset && your_command
Perhatikan bahwa saya menggunakan /var/tmp
bukan /tmp
karena menurut FHS itu tidak seharusnya dihapus pada sistem shutdown / startup.
Saya pikir yang berikut ini harus bekerja 0 0/25 * * *?