Сегодня я хочу рассказать Вам о том, как пользоваться утилитой cron. Понимаю, что многие скажут – “Нафига это надо. Читайте маны. Уже много раз написано.”, но все таки, думаю, что многие еще не разобрались с этим делом, да и еще одна дока лишней не будет.
Cron – это утилита, которая позволяет запускать некоторые скрипты (задания) в определенное время (не только единоразово, но и периодически). Таким образом, cron – это своего рода планировщик заданий.
Конфигурируется он довольно просто. Есть основной файл crontab (обычно располагается в каталоге /etc), где прописываются задания, которые будут выполняться. По умолчанию он имеет вид:
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin# m h dom mon dow user command
17 * * * * root cd / && run-parts –report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts –report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts –report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts –report /etc/cron.monthly )
#
При детальном рассмотрении мы видим упоминание каталогов “/etc/cron.*”. Давайте пока разберемся с синтаксисом времени, а уж потом вернемся к каталогам. Синтаксис используется следующий:
Минуты Часы День_месяца Месяц День_недели Пользователь Команда
Т.е. запись
17 * * * * root cd / && run-parts –report /etc/cron.hourly
буквально означает следующее – в 17 минут каждого часа (знак *) и каждого дня запускать команду “cd / && run-parts –report /etc/cron.hourly” от имени пользователя root.
Отсюда становится понятно назначение каталогов:
- cron.hourly – каталог, содержащий задания, запускаемые ежечасно.
- cron.daily – каталог, содержащий задания, запускаемые ежедневно.
- cron.weekly – каталог, содержащий задания, запускаемые еженедельно.
- cron.monthly – каталог, содержащий задания, запускаемые ежемесячно.
В данном случае, в качестве заданий используются запускаемые скрипты или программы, которые размещают в этих каталогах.
Для примера поставим задачу. Нам необходимо запускать скрипт /home/user/script.sh каждые 3 часа от имени пользователя “user”. Формируем базовую строку:
* * * * * user /home/user/script.sh
Теперь ее исправляем до нужного нам состояния, т.е. указываем, что скрипт будет выполняться каждые 3 часа в 0 минут часа каждую субботу и воскресенье:
0 */3 * * 0,6 user /home/user/script.sh
Или же можно записать иначе:
0 0,3,6,9,12,15,18,21 * * 6,7 user /home/user/script.sh
что, в принципе, равнозначно. Вы наверное спросите почему опечатка в днях недели. Я отвечу, что воскресенье может указываться как 0 (американский стандарт), так и 7 (Российский стандарт).
Для более полной картины приведу вырезку из “man 5 crontab”:
field allowed values
----- --------------
minute 0-59
hour 0-23
day of month 1-31
month 1-12 (or names, see below)
day of week 0-7 (0 or 7 is Sun, or use names)
Думаю, что переводить этот кусок особого смысла не имеет, т.к. и так все понятно.
Кроме того, есть еще один каталог, который может быть весьма полезен пользователям, у которых есть SSH-доступ на сервер, но нет root-прав. Это каталог /var/spool/cron, где располагаются индивидуальные пользовательские задания. На пример, Вам необходимо добавить в крон задание, но прав на правку crontab-файла нет. Создаем в домашнем каталоге (или любом другом) файл cron примерно такого содержания:
SHELL=/bin/bash
MAILTO=user
0-59 * * * * /home/user/script.sh
Выполняем команду:
crontab /home/user/cron
в результате чего в каталоге /var/spool/cron появляется файл с именем пользователя, в данном случае user, и содержимым файла /home/user/cron.
Для просмотра списка заданий можно использовать команду “crontab -l”, для удаления – “crontab -r”, для правки – “crontab -e”.
Вот собственно и все. Не все так сложно, как кажется на первый взгляд.
Поставь fcron, на cron потом смотреть не захочестя
Хм… Спасибо. Посмотрю и озвучу мнение в следующем подкасте.