Я хотел бы запустить работу из cron в 8.30 в первый понедельник каждого месяца. На странице cron Википедии написано
Хотя обычно задание выполняется, когда все поля спецификации времени / даты соответствуют текущему времени и дате, есть одно исключение: если и «день месяца», и «день недели» ограничены (не «*»), то либо поле «день месяца» (3) или поле «день недели» (5) должны соответствовать текущему дню.
(мой акцент)
Означает ли это, что я не могу сделать первый понедельник месяца, я могу сделать только первый (или любой другой) день месяца? Я не могу придумать способ обойти это.
Ответы:
Вы можете поместить условие в фактическую команду crontab:
Теперь, если это условие выполняется в один из первых семи дней месяца, у вас есть первый понедельник. Обратите внимание, что в crontab процентный синтаксис необходимо экранировать, хотя:
Замените
echo
команду фактической командой, которую вы хотите запустить. Я нашел аналогичный подход тоже.источник
[ "$(date '+%a')" = "Mon" ] && echo "It's Monday"
как и[ $(date '+%a') = "Mon" ] && echo "It's Monday"
Но, но в crontab, похоже, не удается в этом тесте. Я не могу получить ни одного полезного отзыва от cron: я пытаюсь[ "$(date '+%a')" = "Tue" ] >> /home/deploy/cron.log 2>&1
зафиксировать любой вывод ошибок в журнал, но это тоже не работает: /date
вывода? Например, простоcron
запустите команду, которая выводит это в файл:date '+%a' > ~/datetest 2>&1
- затем проверьте, привела ли это к правильной строке для сравнения.+%a
необходимом побеге , когда он был в кронтабе, то есть линии , необходимых для таких:[ "$(date '+\%a')" = "Mon" ] && echo "It's Monday"
. Если бы вы могли обновить свой ответ, это было бы полезно для будущих читателей :) Еще раз спасибо - МаксУ меня есть компьютер с языком на испанском языке, поэтому этот подход не работает для меня, потому что понедельник меняется на лун
Другие языки тоже потерпят неудачу, поэтому я немного изменил принятый ответ, который устраняет языковой барьер:
источник
Мне легче, когда нет необходимости обрабатывать номера дней.
Запустите первый понедельник месяца:
то есть, если месяц 1 неделя назад не совпадает с текущим месяцем, то мы находимся в 1-й день 1 (= понедельник) месяца.
Точно так же на третью пятницу
т.е. если месяц 3 недели назад отличается от текущего месяца, то мы находимся на 3-й день 6 (= пятница) месяца
источник
Я запланировал работу на 4-й понедельник каждого месяца в 16:00 следующим образом:
источник
Насколько я знаю, это невозможно при использовании только crontab, однако можно использовать функцию-обертку, чтобы выбрать правильный день из записи contab «первые семь дней месяца»; увидеть это из записи.
Скрипт-обёртка будет
и вам нужно будет запустить его (при условии, что он называется wrapper.sh и доступен глобально), используя запись crontab
источник
На Solaris 10 мне пришлось отформатировать условие следующим образом:
источник
Вы можете попробовать запустить cronjob в течение первых семи дней месяца и разрешить его выполнение только в понедельник.
Выше должно работать на вас.
источник
Я рекомендую использовать
вместо того
чтобы избежать языковой проблемы.
источник
Я сделал общее решение для такого рода проблем, оно работает для первого, второго, третьего ... последнего дня недели месяца.
Вы можете использовать это так:
Скрипт run-if-today проверяет как день недели, так и желаемый диапазон дат недели, если оба совпадают, возвращается 0, в противном случае - 1.
Проверьте код здесь. https://github.com/xr09/cron-last-sunday
источник
Я считаю, что это решает проблему более элегантно:
источник
Поскольку я интерпретирую свои выражения cron с помощью php и js, я не могу использовать bash. В конце концов я обнаружил , что это на самом деле возможно только с хронами:
Надеюсь, это поможет кому-то еще. Несмотря на это, я желаю вам всем прекрасного дня. :-)
источник
Это будет работать каждый понедельник каждого месяца.
источник