Назад | Перейти на главную страницу

как совместить день недели и день месяца в crontab?

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

# run on every day 1 of each month:
59 12 1 * * user script_month

# run on every day 1 of each week:
59 12 * * 1 user script_week

ИЗМЕНИТЬ 1:

Есть ответ, в котором используется «ЕСЛИ», что является хорошим решением.

Как насчет этого:

# run on every day 1 of each week:
59 12 2-31 * 1 user script_week

Может быть, он тоже делает то, о чем я прошу? (запускать все недели в первый день, кроме первого дня месяца)

Изменить 2:

Я нашел это:

"Если оба поля [дата] ограничены (т. Е. Не *), команда будет запущена, когда либо поле соответствует текущему времени. "(источник: http://thewatertower.org.uk/news/000160/crontab_the_first_five_fields_combine_to_restrict_the_schedule_except_for_when_they_dont.html )

Кажется, это невозможно, как я писал в Edit 1?

Есть script_week проверьте, работает ли он в первый день месяца. Если это так, то перед выполнением любой реальной работы дайте ему выйти. Например, в сценарии bash такая проверка может выглядеть так:

if [ `/bin/date +%d` = "01" ]; then exit 0; fi

Если хочешь, можешь уйти script_week без изменений, и вместо этого поставьте аналогичную проверку в crontab запись для script_week, что-то вроде этого:

59 12 * * 1 user if [ `/bin/date +\%d` != "01" ]; then script_week; fi

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

Это также может быть полезно, если это ОЧЕНЬ длительная работа. Иногда я сталкиваюсь с заданиями cron, которые обычно не занимают много времени, но если система работает с журналами обработки с высокой нагрузкой или выполняется большая работа, это может занять больше времени, чем ожидалось. Затем, если несколько из этих заданий запускаются одновременно, они могут начать складываться и в конечном итоге поставить машину на колени.

Маловероятно для задания, которое выполняется раз в неделю, но это хорошая привычка - предотвращать накопление заданий в стеке, и это будет выполнять двойную задачу, предотвращая запуск задания из обеих записей crontab.