Рейтинг:2

определение даты crontab только для второй среды месяца

флаг cn

Как определить дату crontab только для второй среды (каждого месяца)? Я был бы признателен за вашу помощь.

флаг in
Расписание cron слишком грубый инструмент для этого. Вероятно, вы захотите использовать `0 0 * * WED` для запуска задания каждую среду, но укажите сценарий оболочки, который проверяет неделю месяца перед запуском данной задачи.
Soren A avatar
флаг mx
Я думаю, что 1. Среда в месяце всегда будет между 1-м и 7-м днем, и поэтому вторая среда в месяце должна быть между 8-м и 14-м днем ​​... так что-то вроде `0 0 8-14 * WED .....` должен сделать это. Конечно, два первых значения (минуты и часы) могут быть любыми допустимыми значениями минут и часов.
флаг cn
@SorenA https://crontab.guru/#0_0_8-14_*_wed Это работает с 8 по 14 день И в среду :) Вам нужна небольшая корректировка: https://crontab.guru/tips.html Вероятно, требуется 7 строк ` 0 0 */8 * СР`, `0 0 */9 * СР`, `0 0 */10 * СР`, `0 0 */11 * СР`, `0 0 */12 * СР`, ` 0 0 */13 * СР`, `0 0 */14 * СР`
Рейтинг:3
флаг cn

Вы просили cron, поэтому только с помощью cron вы можете сделать это, используя дату bash в качестве второго теста:

0 0 8-14 * * [ "$(date '+\%u')" = "3" ] && {ваш скрипт}
  • Каждый час дней с 8 по 14
  • а затем проверьте среду с датой Баша. День номер 3 — среда

Комментарий от Soren A: немного неправильно (НО справочная страница тоже неверна). 0 0 8-14 * Ср = âВ 00:00 каждого дня месяца с 8 до 14 и в среду». Из последней ссылки:

Совет 1. Если часть дня месяца или дня недели начинается с *, они образуют пересечение. В противном случае они образуют союз. * * 3 * 1 запускается 3-го числа месяца и в понедельник (объединение), тогда как * * */2 * 1 запускается каждый второй день месяца, только если это также понедельник (пересечение). справочная страница неверно об этой детали. Больше информации.

elmclose avatar
флаг cn
Это очень элегантно и компактно. Я попробую. Спасибо, Ринзвинд.
Andrew Lowther avatar
флаг jp
«Совет 1» с https://crontab.guru/tips.html очень интересен. Вы можете включить его в свой ответ, чтобы поддержать утверждение «справочная страница также неверна».
флаг cn
@AndrewLowther да, я сначала подумал об этом и решил не делать этого, но вы правы, поэтому добавил :+
elmclose avatar
флаг cn
Нужна ли обратная косая черта в [ "$(date '+\%u')" = "3" ]?
флаг cn
да, см. `man 5 crontab` "Знаки процента (%) в команде, если они не экранированы обратной косой чертой (\), будут заменены символами новой строки, а все данные после первый % будет отправлен команде в качестве стандартного ввода."
Рейтинг:3
флаг jp

Крон может нет сделать это изначально, но системный таймер может.

Синтаксис крона 0 0 8-14 * Ср будет нет работай. Он будет проходить каждую среду, а также каждый день с 8 по 14 число. Как справочная страница crontab говорит

День выполнения команды можно указать двумя полями — день месяца и день недели. Если оба поля ограничены (т. е. не начинаются с *), команда будет запущена, когда либо поле соответствует текущему времени.

Таймеры systemd по-разному обрабатывают логику и могут делать то, что вы хотите. Этот синтаксис соответствует полуночи второй среды каждого месяца.

OnCalendar=Ср *-*-8..14 00:00:00

Ссылки

флаг cn
да cron может это сделать ;-)
elmclose avatar
флаг cn
Спасибо, Андрей, хорошие ссылки. Я вижу, что одного cron недостаточно для этой работы, как я и подозревал. У меня также есть работа, которую нужно делать в последнюю пятницу каждого месяца. Я воспользуюсь одной из предложенных вторичных проверок и отфильтрую правильную дату.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.