Прочитав документацию crontab, я не могу придумать, как записать следующее расписание: выполнять скрипт ровно один раз каждые 45 дней.
Кто-нибудь знает элегантное решение? Спасибо.
решение1
Поскольку период в 45 дней не делится точно на недели, месяцы или годы григорианского календаря, невозможно ограничить даты, в которые будет запускаться ваш скрипт, и при этом заставить его выполняться во все нужные вам дни.
Из-за этого вам придется запускать команду каждый день и делать так, чтобы она сама возвращалась без выполнения каких-либо действий в 44 из каждых 45 дней.
Например, если вы хотите, чтобы скрипт запустился в 03:17, команда может выглядеть так:
17 3 * * * /usr/local/bin/your-script
А внутри скрипта можно сделать так:
#!/bin/bash
if [[ $[($(date +%s)/86400)%45] != 0 ]]
then
return
fi
real things happen here
Часть != 0
может использовать другой номер в зависимости от того, в какой день вы хотите, чтобы она запустилась в первый раз. И вы можете выбрать, чтобы поместить эту дополнительную логику в crontab, а не в скрипт, хотя лично я нахожу более читабельным сделать это в скрипте.
Обратите внимание, что если ваш часовой пояс использует летнее время, вам может потребоваться настроить выше, чтобы избежать смещения расписания на день при переводе часов. Точные детали зависят от того, какой часовой пояс и какое время суток вы выберете для запуска своего скрипта.
решение2
Возможно, вам придется использовать две записи cronjob: первая на месяц, вторая на 45 дней.
для каждого месяца используйте ниже cron
0 0 1 * * your_script
и 45 дней эта запись cron
10 13 * * * test $(( `date +\%s`/24/60/60\%45 )) = 41 && your_script
Я получил ссылку ниже на 45-дневный график cron
https://stackoverflow.com/questions/8699075/how-to-set-cron-job-for-every-45-days