Прочитав документацию по crontab, я не могу придумать, как записать следующий график: выполнять скрипт ровно один раз каждые 45 дней.
Кто-нибудь знает об элегантном решении? Спасибо.
Поскольку период в 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
part может использовать другое число в зависимости от того, в какой день вы хотите запустить его в первый раз. И вы можете поместить эту дополнительную логику в crontab, а не в скрипт, хотя я лично считаю, что это более читабельно делать в скрипте.
Обратите внимание, что если в вашем часовом поясе используется летнее время, вам может потребоваться настроить указанное выше, чтобы избежать смещения расписания на день при настройке часов. Точные детали зависят от того, какой часовой пояс и какое время дня вы выбираете для запуска сценария.
Возможно, вам потребуется использовать две записи cronjob: первая - на месяц, вторая - на 45 дней.
для каждого месяца использовать ниже cron
0 0 1 * * your_script
и 45 дней эта запись в cron
10 13 * * * test $(( `date +\%s`/24/60/60\%45 )) = 41 && your_script
Я получил ссылку по ссылке ниже на 45 дней cron schedular
https://stackoverflow.com/questions/8699075/how-to-set-cron-job-for-every-45-days