1 авг. 2008 г.

crontab: запуск команд по расписанию

crontab - это команда, которая позволяет вам периодически выполнять команды через определенные промежутки времени с тем преимуществом, что вам нет необходимости входить в систему. crontab отправит вам письмо с отчетом о выполнении вашей команды. Вы можете указывать интервалы в минутах, часах, днях и даже месяцах. В зависимости от указанных опций, crontab будет работать по-разному:
  • -l: Вывод вашего текущего файла crontab.
  • -e: Редактирование вашего файла crontab.
  • -r: Удаление вашего текущего файла crontab.
  • -u <пользователь>: Применение одной из перечисленных выше опций для <пользователя>. Это может сделать только root.

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

# Если вы не хотите получать почту, просто
#   закомментируйте следующую строку
#MAILTO="ваш_адрес_email"
#
# Уведомление о новых изображениях каждые 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). Теперь вашей задачей будет найти полезные команды и поместить их в этот файл!

Формат и значения полей

Каждая команда в пользовательском файле crontab занимает одну строку и состоит из шести полей. Пользовательские файлы crontab находятся в каталоге /var/spool/cron
Общий формат команды:
------------------------------------------------
минута час день_месяца месяц день_недели команда
------------------------------------------------

Допустимые значения:
минута        от 0 до 59
час           от 0 до 23
день_месяца   от 1 до 31
месяц         от 1 до 12 (можно три буквы из названия месяца,
                         регистр не имеет значения от jan до dec)
день_недели   от 0 до 6  (0 это воскресенье,
                         можно писать от sun до sat)
Каждое из полей даты и времени может быть обозначено символом * ,будет соответствовать любому возможному значению. Для этих полей можно указывать диапазоны значений, разделенных дефисом, например:
* 5 4-10 0-3 * echo "HELLO"    -печать HELLO в 5:00 на 4,5,6,7,8,9,10
                               дни января, февраля, марта и апреля
пошаговая запись
* */2 * * sat echo "HELLO"     -печать HELLO каждый четный час,
                               каждую субботу
равнозначная предыдущему примеру запись (списком)
* 0,2,4,6,8,10,12,14,16,18,20,22 * * sat echo "HELLO" 
                              -печать HELLO каждый четный
                               час, каждую субботу
то же самое с указанием диапазона
* 0-23/2 * * sat echo "HELLO"  -печать HELLO каждый четный
                               час, каждую субботу

59 23 31 dec * echo "Happy new year" -без комментариев :),
                                     поздравит с новым годом

Комментариев нет: