Назад | Перейти на главную страницу

Обязательно ли 31 означает конец месяца в работе cron?

Мы знаем, что для работы cron мы можем установить время, как показано ниже.

# +------------ Minute (0 - 59)
# | +---------- Hour (0 - 23)
# | | +-------- Day of the Month (1 - 31)
# | | | +------ Month (1 - 12)
# | | | | +---- Day of the Week (0 - 7) (Sunday is 0 or 7)
# | | | | |
# * * * * * command

Я хочу знать, что когда мы устанавливаем 31-й день месяца, означает ли это конец каждого месяца, хотя в этом месяце нет 31-го дня. Надеюсь получить ответ.

заранее спасибо

Нет, 31 означает 31.

Однако вы можете пойти на хитрость. Установите задание для запуска в любой день, который потенциально может быть последним днем ​​месяца (например, 28–31 в поле дня месяца), а затем замените свою команду выражением оболочки, содержащим тест на дату, защищающую команда:

0 0 28-31 * * [ "`date +%m`" != "`date --date=tomorrow +%m`" ] && command

Выражение внутри тестовых скобок просто спрашивает, отличается ли номер месяца сегодня от номера месяца завтра, что, конечно, будет верно только в последний день месяца. Обратите внимание, что форма этого выражения зависит от вашего местного date - вам может потребоваться настроить его, если у вас нет текущей версии GNU.

Должен сказать, что это не я изобрел - я нашел это с помощью быстрого поиска в Google в сообщении в списке рассылки Мэтью Джарвиса. Однако я могу предположить, что это очень стандартный трюк старого мастера Unix.

Нет, я думаю, лучшее, что вы можете сделать, это запустить в полночь 1-го числа месяца или настроить отдельные строки crontab для каждого месяца (или, по крайней мере, строку для месяцев с 28, 29, 30 и 31 днем)

0 0 28,29 2               * /my/command
0 0 30    4,6,9,11        * /my/command
0 0 31    1,3,5,7,8,10,12 * /my/command

Я не думаю, что вы легко сможете сделать это в crontab.

Один из вариантов - установить cron чтобы запускать скрипт каждый день, а затем заставлять сам скрипт проверять, является ли он последним днем ​​месяца.

Я предполагаю, что в cron есть специальный символ L, предназначенный для этой цели:

*    *    L    *    *    your_script.sh 

будет выполнять ваш скрипт в последний день каждого месяца

С другой стороны,

*    *    0    *    *    your_script.sh

Вы даже можете указать что-то вроде:

*    *    *    *    1,5L    your_scrript.sh

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

или

*    *    *    *    1    your_script.sh

запускать скрипт каждый понедельник в полночь.

Это сделает работу:

if [ $( date +%-d --date="tomorrow" ) -eq 1 ]
then echo Last day of the current month
else echo Not yet!
     exit 0
fi

exit 1