Подтвердить что ты не робот

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

Я использую Bash в RedHat. Мне нужно запланировать работу cron, которая будет работать в 9:00 в первое воскресенье каждого месяца. Я сделал небольшое исследование и увидел, что в этом нет никакой короткой руки.

Вы знаете оптимальный способ?

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

Ответ 4

Это также работает с именами будних дней:

0 0 1-7 * * [ "$(date '+\%a')" == "Sun" ] && /usr/local/bin/urscript.sh

Но,

[ "$(date '+\%a')" == "Sun" ] && echo SUNDAY

будет FAIL на comandline из-за специальной обработки "%" в crontab (также действителен для fooobar.com/questions/138327/...)

Ответ 5

Запуск задачи cron 1-го понедельника, 3-го вторника, последнего воскресенья, всего-навсего.

http://xr09.github.io/cron-last-sunday/

Просто поместите run-if-today script в путь и используйте его с cron.

30 6 * * 6 root run-if-today 1 Sat && /root/myfirstsaturdaybackup.sh

run-if-today script вернет только 0 (bash значение для True), если это правильная дата.

EDIT:

Теперь с более простым интерфейсом, всего один параметр для номера недели.

# run every first saturday
30 6 * * 6 root run-if-today 1 && /root/myfirstsaturdaybackup.sh

# run every last sunday
30 6 * * 7 root run-if-today L && /root/lastsunday.sh

Ответ 6

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

Ответ 7

Если вы не хотите, чтобы 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". Я не знаю, обманывает ли это. Основная идея - найти следующее первое воскресенье. После этого вы можете заменить любой планировщик, который вам нужен, поскольку вы знаете дату и время, когда хотите запустить задание (однако другой планировщик может нуждаться в другом синтаксисе для даты).

Ответ 9

00 09 1-7 * 0/usr/local/bin/once_a_week

каждое воскресенье первых 7 дней месяца