Мы знаем, что для работы 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