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

14

Я добавил это в / etc / crontab на нескольких разных системах linux и freebsd:

# monthly reboot: 3rd Tuesday of every month
56 07 15-21 * 2 root /sbin/shutdown -r now

Я хочу перезагрузку 3-го вторника каждого месяца. Однако все системы перезагрузились в 3-ю среду этого месяца (19-е).

Что я делаю неправильно?

Обновление : благодаря ответу Ранона ниже, похоже, что приведенная ниже ревизия сработает, кто-нибудь может подтвердить или есть еще лучший способ сделать это?

# monthly reboot: 3rd Tuesday of every month
56 07 15-21 * * root test $(date +\%u) -eq 2 && /sbin/shutdown -r now
ана
источник

Ответы:

16

Посмотрите на man 5 crontab.

Примечание. День выполнения команды можно указать двумя полями - день месяца и день недели. Если оба поля ограничены (т. Е. Не *), команда будет запущена, когда любое из полей соответствует текущему времени. Например, `` 30 4 1,15 * 5 '' будет запускать команду в 4:30 утра 1-го и 15-го числа каждого месяца плюс каждую пятницу. Однако можно достичь желаемого результата, добавив тест к команде (см. Последний пример в ПРИМЕРЕ CRON FILE ниже).

Таким образом, ваши серверы должны перезагружаться каждый день с 15-21 и каждый вторник.

Посмотрите на пример manpages:

# Run on every second Saturday of the month
0 4 8-14 * *    test $(date +%u) -eq 6 && echo "2nd Saturday"
Йенс Эрат
источник
6
Это серьезно похоже на ошибку дизайна. Если бы я хотел каждый день с 15-21 и каждый вторник, я бы сделал две отдельные записи crontab. Необходимость прибегнуть к отдельному тесту - отвратительный взлом. Тем не менее, спасибо за предоставление обходного пути!
Лоуренс Гонсалвес