CronJob каждые 25 минут


13

Я хочу знать, есть ли какой-нибудь более легкий способ выполнять работу каждые 25 минут. В cronjob, если вы укажете параметр минуты как * / 25, он будет запускаться только на 25-й и 50-й минуте каждого часа

Ответы:


15

Команда в crontab выполняется с /bin/shтем, чтобы вы могли использовать арифметическое расширение, чтобы вычислить, равна ли текущая минута по модулю 25 нулю:

*/5 * * * * [ $(( $(date +\%s) / 60 \% 25 )) -eq 0 ] && your_command

cronбудет запускать всю эту запись каждые 5 минут, но только если текущая минута (в минутах с начала эпохи) по модулю 25 будет равна нулю, она будет работать your_command.

Как отмечали другие, 1 день не делится поровну на 25 минут, поэтому он не your_commandбудет запускаться в одно и то же время каждый день, но он будет выполняться каждые 25 минут.


просто гениально ...
Томас

Обратите внимание, что, по крайней мере, в реализации cron из ISC вам нужно экранировать символы% с обратной косой чертой.
Стефан Шазелас

@ StéphaneChazelas, хорошая мысль. Я пошел дальше и добавил обратную косую черту перед знаками процента, потому что, насколько мне известно, каждая реализация cron требует этого.
КОД-ЧИТАТЬ

7

Лучше всего бегать по 20 или 30 минут.

В следующем случае лучше всего запускать каждые 5 минут, а затем вести внутренний подсчет или метку времени и запускать каждый 5-й запуск, или если с момента последнего запуска прошло 25 минут.

Более сложным было бы определить правильное время для дня, начиная с полуночи, и принять ошибку в конце дня. Это будет включать дублирование записи в crontab для разных часов.

Более сложным было бы определить время на целый месяц, что потребовало бы много копий записи в crontab, чтобы охватить различные комбинации.

Наконец, вы можете реализовать свой собственный всегда на демон и сделать это планирование.


6

У меня нет прямого опыта с этим, но 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 минут здесь?
Филомат

Использование fcron и @ 25 commandдолжно сделать свое дело.
Калеб

Спасибо, Калеб. Я должен был создать специально подобранный пример вместо того, чтобы убрать один прямо из документации.
che2cbs

2

Позвольте мне вкратце объяснить, в чем здесь проблема. Ввод 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. и так далее и так далее ...


Возможно, ответом должен был стать комментарий к исходному вопросу.
Филомат

1

Вы можете играть с последним временем изменения файла

  • Создайте небольшой скрипт (например /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 он не должен быть удален при выключении системы / запуске.


-2

Я думаю, что следующее должно работать 0 0/25 * * *?


Насколько я знаю, это будет работать каждую минуту.

Это будет выполняться в час один раз каждые ... 25 часов? 0/25 ... даже не уверен, что это делает, но это не то, что после ОП.
Калеб
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.