Позволяет ли выражение cron в unix / linux указывать точные даты начала и окончания - PullRequest
14 голосов
/ 01 апреля 2009

Я хочу иметь возможность настроить что-то вроде этого.

  1. Я хочу выполнять задание «Х» ежедневно в 7 часов утра, начиная с 29 июня 2009 года по 30 декабря 2009 года. Считайте текущую дату 4/4/2009.

Ответы [ 5 ]

15 голосов
/ 01 апреля 2009

Это можно сделать хитрым способом.

Для этого диапазона требуется три отдельных задания cron, все из которых работают с одним и тем же кодом (в данном случае X):

  • один за 29 и 30 июня ("0 7 29,30 6 * X").
  • по одному на каждый день с июля по ноябрь ("0 7 * 7-11 * X").
  • один за всех, кроме последнего дня декабря ("0 7 1-30 12 * X").

Это дает вам:

# Min   Hr   DayOfMonth   Month   DayOfWeek   Command
# ---   --   ----------   -----   ---------   -------
   0     7      29,30        6        *          X
   0     7          *     7-11        *          X
   0     7       1-30       12        *          X

Тогда обязательно прокомментируйте их до 29 июня 2010 года. Вы можете добавить окончательное задание cron 31 декабря, чтобы отправить вам электронное письмо о необходимости его отключения.

Или вы можете изменить X для немедленного выхода, если год не 2009.

if [[ "$(date +%Y)" != "2009" ]] ; then
    exit
fi

Тогда не будет иметь значения, если вы забудете отключить задания.

4 голосов
/ 03 апреля 2009

Да, в основном. Некоторые реализации cron поддерживают годами, а некоторые нет, поэтому мы предполагаем, что у вас нет. Кроме того, я предполагаю, что это задание выполняется только демоном cron, поэтому мы можем использовать бит выполнения, чтобы определить, должен ли cron запускать задание.

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

Следующие выражения cron будут делать то, что вы хотите (каждый день, включая выходные). Твик как надо:

# Make the job executable on 29 June.
0 6 29 6 * chmod +x /path/to/my/job/script

# Run the job between June and December, only if it's executable.
0 7 * 6-12 * test -x /path/to/my/job/script && /path/to/my/job/script

# Disable execution after 30 December.
0 8 30 12 * chmod -x /path/to/my/job/script
2 голосов
/ 21 апреля 2009

Я обычно фанат сохранения логики при запуске программы. Вы можете подумать о настройке одного задания cron, которое запускает скрипт каждый день, а затем сделать так, чтобы скрипт сам решал, должен ли он делать что-то полезное. По истечении последнего полезного дня (30 декабря) ваш скрипт может удалить себя из crontab. В сценарии вы можете настроить логику со всеми комментариями, необходимыми для описания того, что вы делаете и почему.

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

0 голосов
/ 01 апреля 2009

Нет, афаик, ты не можешь этого сделать.

Поля cron содержат значения минут, часов, дня месяца, месяца и дня недели соответственно.

10 5 10 * * means run at 5:10 on every 10th of every month.

10 5 * 12 * means run at 5:10 on every day in december

10 5 * * 1  means run at 5:10 every Monday

Вы можете запустить его в течение нескольких месяцев, так как формат crontab принимает диапазоны. С апреля по декабрь будет 4-12 в этом случае для поля месяца. Но это не учитывает ваше желание ограничиться 2009 годом.

Нет механизма для установки даты начала и окончания cronjob. Вы всегда можете написать это, конечно. Делайте cronjob каждый день и проверяйте текущую дату до 30/12. Если это 31/12, сделайте это самостоятельно. Или что-то более продуманное.

Crontab

0 7 * * 6-12 command_X

будет делать то, что вы хотите частично, но он начнется 1 июня и продлится до 31 декабря. Пропуск первой части июня и 31 декабря должен быть записан в команде X.

0 голосов
/ 01 апреля 2009

Вы можете использовать это для генерации crontab, который запускается через определенные интервалы:

http://www.robertplank.com/cron/

Или это

http://www.webmaster -toolkit.com / хрон-generator.shtml

Одним из решений было бы установить 6 крон, по 1 на каждый месяц, каждый работал бы в 7 часов утра каждый день в этом месяце.

Вероятно, это самый простой способ, следующим будет сценарий.

...