3. Запуск команд по расписанию

3.1. crontab: Уведомления или редактирование вашего файла crontab

crontab позволяет вам периодически выполнять команды через определенные промежутки времени с тем преимуществом, что вам нет необходимости входить в систему. crontab отправит вам письмо с отчетом о выполнении вашей команды. Вы можете указывать интервалы в минутах, часах, днях и даже месяцах. В зависимости от указанных опций, crontab будет работать по-разному:

  • -l: вывод вашего текущего файла crontab;

  • -e: редактирование вашего файла crontab;

  • -r: удаление вашего текущего файла crontab;

  • -u <пользователь>: применение одной из перечисленных выше опций для <пользователя>. Это может сделать только root.

Давайте начнем с редактирования crontab'а. Если вы введете команду crontab -e, перед вами окажется ваш любимый текстовый редактор, если у вас установлена переменная окружения EDITOR или VISUAL, в противном случае будет использован Vi. Строка в файле crontab состоит из шести полей. Первые пять полей - это интервалы времени в минутах, часах, днях месяца, месяцах и днях недели соответственно. Шестое поле - это выполняемая команда. Строки, начинающиеся с # - это комментарии, они будут проигнорированы демоном crond (программой, отвечающей за выполнение заданий из crontab). Этот формат несколько отличается для системного crontab'а (файл /etc/crontab). В нем в качестве шестого поля выступает имя пользователя, которое будет использовано для запуска программы из седьмого поля. Этот файл должен быть использован только для задач администрирования и для запуска заданий пользователей, которые существуют только для обеспечения безопасности системы (такие как пользователь демона антивируса или пользователь для запуска сервера баз данных). Вот пример файла crontab:

[Замечание]Замечание

Для того, чтобы напечатать его удобочитаемым шрифтом, мы должны были разорвать длинные строки. Поэтому некоторые участки кода должны быть набраны одной строкой. Когда строка заканчивается знаком \, это означает, что строка имеет продолжение. Это соглашение действительно в файлах Makefile, в shell'е, а также в других контекстах.

# Если вы не хотите получать почту, просто
#   закомментируйте следующую строку
#MAILTO="ваш_электронный_адрес"
#
# Уведомление о новых изображениях каждые 2 дня в 14:00, 
#   из примера выше - после чего, выполнение "retouch"
#   для файла "stamp". Знак "%" означает 
#   новую строку, это позволяет вам указывать несколько команд 
#   в одной строке.
0 14 */2 * *  find /shared/images              \
  -cnewer /shared/images/stamp                 \
  -a -iregex ".*\.jpe?g"            \
  -a -not -regex                               \
    ".*/old/.*"%touch /shared/images/stamp
#
# Воспроизведение мелодии на каждое Рождество :)
0 0 25 12 * mpg123 $HOME/sounds/merryxmas.mp3
#
# Каждый вторник в 17:00 вывод списка покупок...
0 17 * * 2 lpr $HOME/shopping-list.txt

Существует несколько способов указания интервалов, кроме тех, что показаны в этом примере. Вы можете указать набор дискретных значений, разделенных запятыми (1,14,23) или диапазон (1-15), или даже комбинировать их (1-10,12-20), а можно и с некоторым шагом (1-12,20-27/2). Теперь вашей задачей будет найти полезные команды и поместить их в этот файл!

3.2. at: Выполнение команды по расписанию, но только один раз

Возможно, вы хотели бы выполнить какую-нибудь команду в определенный день, но только один раз. Например, вам нужно напомнить себе о сегодняшней встрече в 18:00. Вы работаете в X, у вас установлен пакет X11R6-contrib и вы хотели бы получить напоминание, скажем, в 17:30 о том, что пора выходить. Тогда at - это то, что вам нужно:

$ at 17:30
  # Теперь перед вами приглашение "at"
at> xmessage "Пора идти! Встреча в 18:00"
  # Нажмите CTRL-d для выхода
at> <EOT>
job 1 at 2005-02-23 17:30
$

Указывать время можно разными способами:

  • now +<интервал>: означает сейчас + интервал (Не обязателен. Отсутствие интервала означает немедленное выполнение). Синтаксис для интервала: <n>(minutes|hours|days|weeks|months). Здесь minutes - минуты, hours - часы, days - дни, weeks - недели и months - месяцы. Например, вы можете указать now + 1 hour (через один час), now + 3 days (через трое суток) и так далее.

  • <time> <day>: полное указание даты. Опция <time> (время) является обязательной. Ее формат для at довольно свободный: вы, например, можете ввести 0100, 04:20, 2am, 0530pm, 1800 или одно из трех специальных значений: noon (полдень), teatime (время вечернего чая в 16:00) или midnight (полночь). Опция <day> (день) является необязательной. Вы также можете указать ее различными способами: например, 12/20/2004, что соответствует двадцатому декабря 2004 года, или, по европейскому стандарту, 20.12.2004. Вы можете не указывать год, но тогда допускается только европейская форма записи: 20.12. Также вы можете записать месяц буквами: и Dec 20, и 20 Dec будут верны.

Также at допускает использование разнообразных опций:

  • -l: выводит список заданий, стоящих в очереди на выполнение. Первое поле представляет собой номер задания. Это эквивалент команды atq.

  • -d <n>: удаляет из очереди задание под номером <n>. Вы можете получить номера заданий при помощи команды atq. Это эквивалент команды atrm <n>.

Как обычно, для получения дополнительной информации смотрите страницу руководства для at(1).