Чи обов'язково 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.