Часто возникает задача сделать выполнение какого-либо скрипта регулярным, периодическим. Это может быть отправка или проверка почты, периодическое сохранения копий обрабатываемых данных и др. Для этих задач UNIX-системы предлагают нам решение – планировщик задач cron. Напрямую редактировать файлы cron не рекомендуется, для этого существует утилита crontab.
Просмотр и редактирование списка задач
Просмотреть список уже установленных задач можно командой:
1 | crontab -l |
Для добавления задачи используется команда:
1 | crontab -e |
Просмотрев список задач, мы можем увидеть что-то похожее на это:
1 2 3 4 5 6 7 | PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin HOME=/home/project/crons */15 * * * * php start.php emails 1 */6 * * * php start.php merchants/update_draft 0 2 * * * python /home/timer/grab.py #30 0 * * * php start.php reports |
В верхней части задаются переменные. PATH указывает на директории поиска программ для выполнения наших задач. В этом случае эти программы — это php и python. В переменной HOME задается домашняя директория пользователя, относительно которой задаются имена самих исполняемых файлов, если не указан полный путь. В нашем случае это, например, start.php.
Далее следует непосредственно список заданий. Каждая строка состоит из значений в 6-ти колонках разделенных пробелами или табуляторами. В первых 5-ти задаются временные параметры а 6-ым является непосредственно выполняемая команда. Для отключения комманды в начале ее необходимо поставить символ #. В нашем случае отключена 4-я команда.
В общем виде строка в crontab выглядит следующим образом:
MIN HOUR DOM MON DOW CMD
MIN – 0 — 59 – Это минуты выполнения задач.
HOUR – 0 — 23 – Часы. Задаются в 24-формате.
DOM – 1 — 31 – Дни месяца.
MON – 1 — 12 – Номер месяца в году.
DOW – 0 — 7 – День недели. Вс=0 и =7
CMD Команда
Для сокращения пути к файлам, можно объявить переменную, например:
1 | $TESTDIR = /home/user/test |
Теперь мы можем ее использовать в пути к исполняемым файлам:
1 | * * * * * php $TESTDIR/test.php |
Алиасы кронов
В crontab существуют специальные заменители некоторых, часто встречающихся условий.
@yearly 0 0 1 1 *
@daily 0 0 * * *
@hourly 0 * * * *
@reboot при загрузке
Например, следующая задача будет выполняться в 0 часов 0 минут 1 января каждого года:
1 | @yearly /home/michael/accounting/annual-maintenance |
Ошибки при сохранении
Если при попытке сохранить вы получили ошибки, например:
1 2 3 4 5 | /tmp/crontab.xxxxxxx: 1 строк, 9 символов crontab: installing new crontab "/tmp/crontab.xxxxxxx":1: bad minute crontab: errors in crontab file, can't install Do you want to retry the same edit? |
Запустите снова редактирование командой crontab -l, внимательно проверив и исправив ошибки, затем сохраните файл снова.
Крон из файла
Также есть возможность установить список задач из текстового файла. Это удобно при переносе проекта с одного сервера на другой.
Это делается командой:
1 | crontab cron-file.txt |
1 2 | michael@dev-db$ crontab -l no crontab for michael |
1 2 3 | $ cat cron-file.txt @yearly /home/michael/accounting/annual-maintenance */10 * * * * /home/michael/check-disk-space |
1 | michael@dev-db$ crontab cron-file.txt |
1 2 3 | michael@dev-db$ crontab -l @yearly /home/michael/annual-maintenance */10 * * * * /home/michael/check-disk-space |
Следует обратить внимание что этот вариант установки очистит список задач установленных ранее. Следует использовать его с особой осторожностью.
Отправка по почте вывода
Определив переменную MAILTO, вы можете получать сообщения об отработавших задачах:
1 | MAILTO = michael@yandex.ru |
Если же нужно несколько адресов, то их можно указать через запятую.
На почту будет отправлятьcя весь вывод скриптов.
Перенаправление вывода
Если вам необходимо сохранять в файл вывод программы, то для этого необходимо использовать следующую конструкцию:
1 | * * * * * php /home/michael/test.php > /home/michael/tmp/output.txt |
Здесь в файл output.txt будет сохраняться все, что выводит скрипт test.php.
Если необходимо дописывать в файл, то используется следующий вариант команды:
1 | * * * * * php /home/michael/test.php >> /home/michael/tmp/output.txt |
Следующая команда заглушает вывод скрипта:
1 | >/dev/null 2>/dev/null |
2 означает поток ошибок STDERR.
Следующая конструкция применяется совместно с переменной MAILTO. Таким образом вам в почтовом сообщении придут только возникшие ошибки.
1 | > /dev/null 2>&1 |
Ошибки кронов
По умолчанию Cron пишет свой лог в файл /var/log/syslog.
Что бы просмотреть сообщения, которые записаны непосредственно кроном можно использовать следующую команду:
1 | grep CRON /var/log/syslog |
Кроны для других пользователей
Чтобы просмотреть кроны других пользователей системы, необходимо войти в систему под пользователем root и использовать команду:
1 | root@dev-db# crontab -u matthew -l |
где matthew – имя пользователя.
Почти так же происходит и редактирование задач других пользователей, вместе ключа -l используется -e:
1 | crontab -u matthew -e |
Графический интерфейс
Для удобства использование планировщика на рабочих машинах возможно использовать графический интерфейс для управления периодическими задачами.
Для GNOME-окружения рабочего стола существует gnome-schedule:
1 | sudo apt-get install gnome-schedule |
Для KDE-дистрибутивов есть графическая оболочка, которая называется kde-config-cron.
И еще немного примеров
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #выполнять каждую минуту * * * * * /home/michael/script.pl #выполнять задание раз в час в 5 минут 5 */1 * * * /home/michael/script.pl #выполнять задание каждые шесть часов в 0 минут 0 */6 * * * /home/michael/script.pl #выполнять задание по понедельникам в 1 час 15 минут ночи 15 1 * * 1 /home/michael/script.pl #выполнять задание 17 сентября в 0 часов 30 минут каждый год 30 0 17 9 * /home/michael/script.pl |