Ответы:
Команда в crontab выполняется с /bin/sh
тем, чтобы вы могли использовать арифметическое расширение, чтобы вычислить, равна ли текущая минута по модулю 25 нулю:
*/5 * * * * [ $(( $(date +\%s) / 60 \% 25 )) -eq 0 ] && your_command
cron
будет запускать всю эту запись каждые 5 минут, но только если текущая минута (в минутах с начала эпохи) по модулю 25 будет равна нулю, она будет работать your_command
.
Как отмечали другие, 1 день не делится поровну на 25 минут, поэтому он не your_command
будет запускаться в одно и то же время каждый день, но он будет выполняться каждые 25 минут.
Лучше всего бегать по 20 или 30 минут.
В следующем случае лучше всего запускать каждые 5 минут, а затем вести внутренний подсчет или метку времени и запускать каждый 5-й запуск, или если с момента последнего запуска прошло 25 минут.
Более сложным было бы определить правильное время для дня, начиная с полуночи, и принять ошибку в конце дня. Это будет включать дублирование записи в crontab для разных часов.
Более сложным было бы определить время на целый месяц, что потребовало бы много копий записи в crontab, чтобы охватить различные комбинации.
Наконец, вы можете реализовать свой собственный всегда на демон и сделать это планирование.
У меня нет прямого опыта с этим, но fcron, кажется, делает то, что вы хотите из коробки. Согласно его документации вы можете указать частоты:
# 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
должно сделать свое дело.
Позвольте мне вкратце объяснить, в чем здесь проблема. Ввод 25 в поле минут приводит cron
к выполнению, когда минуты текущего времени равны 25, то есть один раз в час. Вы можете ввести список совпадений, проблема в том, что 60 (минут в час) не делится на 25, поэтому вам нужно добавить несколько записей в зависимости от часа. Наименьшее общее кратное 60 и 25 - 300, то есть 5 * 60. Поэтому вам нужно будет циклически повторяться в течение 5 часов, пока не вернетесь к исходному началу. например:
0, 25, 50
15, 40
5, 30, 55
20, 45
10, 35
...
Но опять же, 24 (часы в день) не делятся на 5, наименьшее общее кратное 5 и 24 просто 5 * 24 = 120. и так далее и так далее ...
Вы можете играть с последним временем изменения файла
Создайте небольшой скрипт (например /usr/local/bin/age
), который будет выводить возраст файла:
#bin/sh
echo $(( $( date +%s ) - $( stat -c %Z $1 ) ))
Ваш crontab будет выглядеть так (при условии, что 25 минут равны 1500 секундам, если я прав)
* * * * * [ $(/usr/local/bin/fileage /var/tmp/your_command.offset) -gt 1500 ] && touch /var/tmp/your_command.offset && your_command
Обратите внимание, что я использую /var/tmp
вместо того, /tmp
потому что в соответствии с FHS он не должен быть удален при выключении системы / запуске.
Я думаю, что следующее должно работать 0 0/25 * * *?