Я использую Bash в RedHat. Мне нужно запланировать работу cron, которая будет работать в 9:00 в первое воскресенье каждого месяца. Я сделал небольшое исследование и увидел, что в этом нет никакой короткой руки.
Вы знаете оптимальный способ?
Я использую Bash в RedHat. Мне нужно запланировать работу cron, которая будет работать в 9:00 в первое воскресенье каждого месяца. Я сделал небольшое исследование и увидел, что в этом нет никакой короткой руки.
Вы знаете оптимальный способ?
Вы можете поместить что-то подобное в файл crontab
:
00 09 * * 7 [ $(date +\%d) -le 07 ] && /run/your/script
date +%d
дает вам номер текущего дня, а затем вы можете проверить, меньше или равен день 7. Если это так, запустите свою команду.
Если вы запускаете этот script только по воскресеньям, это означает, что он работает только в первое воскресенье месяца.
Помните, что в файле crontab
параметры форматирования для команды date
должны быть экранированы.
Вам нужно объединить два подхода:
a) Используйте cron
для запуска задания каждое воскресенье в 9:00.
00 09 * * 7 /usr/local/bin/once_a_week
b) В начале once_a_week
вычислите дату и выберете день месяца через оболочку, Python, C/С++,... и тест, который находится в пределах от 1 до 7 включительно. Если да, выполните реальный script; если нет, выйдите молча.
Хакерное решение: запустите каждое задание cron каждое воскресенье, но пусть ваш script проверяет дату при запуске и немедленно выйдет, если день месяца → 7...
Это также работает с именами будних дней:
0 0 1-7 * * [ "$(date '+\%a')" == "Sun" ] && /usr/local/bin/urscript.sh
Но,
[ "$(date '+\%a')" == "Sun" ] && echo SUNDAY
будет FAIL на comandline из-за специальной обработки "%" в crontab (также действителен для fooobar.com/questions/138327/...)
Запуск задачи 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
возможно, используйте cron.hourly для вызова другого script. Затем script проверяет, будет ли это первое воскресенье месяца и 9 утра, и если да, запустите свою программу. Звучит достаточно для меня: -).
Если вы не хотите, чтобы 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 15 10? * 1 # 1
http://www.quartz-scheduler.org/documentation/quartz-1.x/tutorials/crontrigger
00 09 1-7 * 0/usr/local/bin/once_a_week
каждое воскресенье первых 7 дней месяца