Чи обов'язково 31 має на увазі кінець місяця на роботі з крон?


13

Для роботи з хроном ми знаємо, що можемо встановити час, як показано нижче.

# +------------ 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. Сподіваюся отримати відповідь.

Спасибі заздалегідь

Відповіді:


22

Ні, 31 означає 31.

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

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

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

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


1
Це не може бути занадто старим трюком, враховуючи специфічні для GNU параметри "date" =)
— jj33

4
На сайтах stackexchange задавати питання, на які можна відповісти за допомогою пошуку в Google, НЕ є поганою справою. Насправді це добре, адже наступна людина, яка шукатиме це в Google, знайде відповідь на stackexchange і приїде сюди.
— miernik

12

Ні, я думаю, що найкраще, що можна зробити, - це запустити опівночі 1-го числа місяця, або встановити окремі лінії лінійки на кожен місяць (або принаймні, рядки на місяці з 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

Спасибі Павло! Я піду за другим. Для другого методу мені потрібно встановити один і той же файл тричі? Ще раз дякую :)

Так, вам потрібно буде це повторити.
— Пол Діксон

7
Я не маю досвіду роботи з cron, але чи не "0 0 28,29 2" виконати двічі за високосний рік? Не те, щоб це було проблемою протягом наступних двох років, але все одно ...
— Вім десять Бринк

Це хороший момент, не простий шлях до цього
— Пол Діксон

4

Я не думаю, що ти можеш це легко зробити crontab.

Одним із варіантів було б встановити cronзапуск сценарію щодня, а потім зробити так, щоб сам сценарій перевіряв, чи є останнім днем ​​місяця.


3

Я думаю, що у крона є спеціальний символ "L", призначений для цієї мети:

*    *    L    *    *    your_script.sh 

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

З іншого боку,

*    *    0    *    *    your_script.sh

Ви навіть можете вказати щось на кшталт:

*    *    *    *    1,5L    your_scrript.sh

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

або

*    *    *    *    1    your_script.sh

запускати сценарій кожного понеділка опівночі.


0

Це зробить роботу:

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

exit 1
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.