Как запланировать выполнять первое воскресенье каждого месяца

Я использую Bash на Redhat. Я должен запланировать задание крона для выполнения в в 9:00 в первое воскресенье каждого месяца. Как я могу сделать это?

50
задан Mark Amery 14 July 2018 в 11:57
поделиться

5 ответов

Вы можете поместить что-то вроде этого в файл crontab:

00 09 * * 7 [ $(date +\%d) -le 07 ] && /run/your/script

The date +%d дает вам номер текущего дня, а затем вы можете проверить, меньше или равен ли этот день 7. Если да, то выполните команду.

Если вы запускаете этот скрипт только по воскресеньям, это должно означать, что он запускается только в первое воскресенье месяца.

Помните, что в файле crontab параметры форматирования для команды date должны быть экранированы.

132
ответ дан 7 November 2019 в 10:31
поделиться

. Вам нужно объединить два подхода:

a) Используйте cron для запускать работу каждое воскресенье в 9:00.

 00 09 * * 7     /usr/local/bin/once_a_week

b) В начале once_a_week вычислите дату и извлеките день месяца с помощью оболочки, Python, C / C ++, ... и проверьте, что находится в пределах от 1 до 7 включительно. Если это так, выполните настоящий сценарий; если нет, молча выйдите.

12
ответ дан 7 November 2019 в 10:31
поделиться

Хакерское решение: запускайте задание cron каждое воскресенье, но пусть ваш скрипт проверяет дату запуска и немедленно завершает работу, если день месяца> 7 ...

5
ответ дан 7 November 2019 в 10:31
поделиться

возможно, использовать cron.hourly для вызова другого скрипта. Этот скрипт будет проверять, не первое ли это воскресенье месяца и не 9 утра, и если да, то запускать вашу программу. По-моему, достаточно оптимальный вариант :-).

0
ответ дан 7 November 2019 в 10:31
поделиться

Если вы не хотите, чтобы cron выполнял ваше задание каждый день или каждое воскресенье, вы можете написать обертку, которая будет выполнять ваш код, определять следующее первое воскресенье и планировать свой запуск на эту дату.

Затем запланируйте эту обертку на следующее первое воскресенье месяца. После этого она будет все делать сама.

Код будет выглядеть примерно так (акцент на чем-то... проверка ошибок не производится):

#! /bin/bash
#We run your code first
/path/to/your/code
#now we find the next day we want to run
nskip=28 #the number of days we want to check into the future
curr_month=`date +"%m"`
new_month=`date --date='$nskip days' +"%m"`
if [[ curr_month = new_month ]] 
then
((nskip+=7))
fi
date=`date --date='$nskip days' +"09:00AM %D` #you may need to change the format if you use another scheduler
#schedule the job using "at"
at -m $date < /path/to/wrapper/code

Логика проста - найти следующее первое воскресенье. Поскольку мы начинаем в первое воскресенье текущего месяца, прибавление 28 приведет нас либо к последнему воскресенью текущего месяца, либо к первому воскресенью следующего месяца. Если это текущий месяц, то мы увеличиваем до следующего воскресенья (которое будет в первую неделю следующего месяца).

И я использовал "at". Я не знаю, является ли это обманом. Главная идея заключается в том, чтобы найти следующее первое воскресенье. После этого вы можете подставить любой планировщик, какой захотите, поскольку вы знаете дату и время, когда хотите запустить задание (в другом планировщике может потребоваться другой синтаксис для даты).

0
ответ дан 7 November 2019 в 10:31
поделиться