>_ IzzyLab

Практическое задание

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

сложно

Настрой в crontab root задачу /opt/monthly-maint.sh, которая запускается только в первый понедельник каждого месяца в 09:00. Внимание на классическую особенность cron: если задать одновременно день месяца и день недели, cron объединит их через ИЛИ (сработает и в дни 1-7, и во все понедельники) — так неверно. Обойди это.

Что потренируешь:
  • cron
  • crontab
  • день недели
  • date
  • первый понедельник

Разбор темы

У cron есть классическая ловушка: если в расписании заданы одновременно поле дня месяца (3-е) и поле дня недели (5-е), они объединяются по ИЛИ, а не по И — задача сработает и во все указанные числа, и во все указанные дни недели. Поэтому условие вроде «первый понедельник» одним расписанием не выражается. Обходят это так: расписанием сужают диапазон чисел до первой недели, а точную проверку дня недели выносят в саму команду — через тест над выводом date (формат %u даёт номер дня недели), причём в crontab знак процента требует экранирования.

Что проверяется

  1. расписание 1-7 по дню месяца, dow=*
  2. проверка понедельника в команде

Как это выглядит