Відповіді:
Команда в 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 хвилин з моменту останнього запуску.
Складніше було б розробити правильний час для дня, починаючи з опівночі, і визнати помилку наприкінці дня. Це передбачало б дублювання запису на кронтабелі в різні години.
Складнішим, ніж це, було б відпрацювання часу протягом цілого місяця, що залучало б багато примірників запису на кронтаб, щоб охопити різні поєднання.
Нарешті, ви можете завжди реалізовувати свій власний демон, і це робити планування.
Я не маю прямого досвіду з цим, але, здається, 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 ) ))
Ваш кронтаб виглядатиме так (якщо припустити, що 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 * * *?