Cron не работает в определенный день, но все остальные дни

8

У меня есть установка cron для ежедневного выполнения скрипта bash в 22:00. У меня есть другая установка cron, которая запускается ежемесячно 1-го числа месяца. Оба крона запускают скрипт bash, и единственное отличие в скрипте bash - это аргумент, который они передают в базовую Java-программу (эмуляция запуска Java-программы из командной строки).

Проблема в том, что мне нужно как-то отключить ежедневный cron 1-го числа месяца, чтобы оба не пытались работать в один и тот же день. Возможно ли это сделать автоматически?

Я полагаю, я могу создать еще один скрипт bash, чтобы редактировать cron до 1-го, а затем снова после того, как все восстановится, но это кажется ... нечистым

SnakeDoc
источник
не у всех месяцев есть 31 день, разве это не вызывает проблемы?
SnakeDoc
Нет
Stéphane Chazelas
хорошая альтернатива решению, предлагаемому @suspectus
SnakeDoc
2
или 2-31 для поля дня месяца.
пепел
@ash - посмотри мой ответ, именно это я и предложил.
SLM

Ответы:

10

Аналогично решению, предложенному @StephaneChazelas в комментариях, вы можете указать диапазон дней в 3-м поле в качестве диапазона для cron, который вы хотите запускать каждый день, кроме 1-го числа месяца.

Следующие две записи будут выполнять то, что вы после:

   0 22 1 * *      /path/to/script/1st_of_the_month.bash    
   0 22 2-31 * *   /path/to/script/every_day_except_1st.bash
SLM
источник
на самом деле, кажется, не работает для меня (если я не делаю что-то не так) - форматирование в комментариях ужасно - так что посмотрите мой исходный код, пожалуйста, чтобы узнать, что я получаю: pastebin.com/RKvy5d4e
SnakeDoc
К сожалению, это должно быть 0 22 2-31 * * в вашем примере. я отредактирую
SnakeDoc
1
@SnakeDoc - спасибо, все эти столбцы начинают смешиваться через некоторое время 8-)
slm
да, я тоже их забыл - я их настроил, потом забыл, как я это сделал (хорошая вещь для man-страницы,
смеется
8

Самый простой способ справиться с этим - просто ввести одну запись cron. Измените скрипт bash, чтобы проверить дату - если это 1-е число месяца, тогда вызовите java-программу с ежемесячными параметрами, иначе вызовите программу с ежедневными параметрами.

Изменение скрипта упрощает процесс, так как скрипт как документ будет лучше описывать происходящее, не требуя дополнительной информации в таблице cron.

Скриптовые моды могут выглядеть примерно так:

if [ $(date '+%d') == "1" ];then
   # monthly code
else
   # daily code
fi
suspectus
источник
1
в конечном итоге пойти с этим решением. Я создал еще один сценарий bash с вашим примером кода, и под месячным - он запускает ежемесячный сценарий bash (который, в свою очередь, передает ежемесячный аргумент в основную программу Java), ежедневно
запускает
0
if [ $(date '+%d') == "1" ];then
  # monthly code
else
   # daily code
fi

Я думаю, используя целочисленное сравнение, если более правильно

date '+% d' возвращает 01, а не 1, поэтому использование сравнения строк == будет ложным

вместо

if [ $(date '+%d') eq 1 ];then
    # monthly code
else
   # daily code
fi
Wodel
источник