Планировщик в Linux или как правильно использовать crontab

Вся красота операционной системы Linux заключается в возможности использования консольных команд. Консоль в Linux – это гибкий интерфейс и при умелом его использовании, является очень мощным инструментом. Благодаря терминалу в Linux можно выполнять простые вещи, которые в ОС Windows выполняются только с помощью дополнительных приложений.


В Linux практически все вещи можно выполнить через консольные команды: запустить проигрывание мелодии с определенного времени, проверить когда истекает срок регистрации доменного имени, запустить антивирусную проверку файлового хранилища для компьютеров с Windows, синхронизировать одной командой 2-3 сетевые директории. Благодаря гибкости консоли и использованию консольных команд, можно увидеть всю мощность crontab и возможности, которыми он обладает.

Работа с планировщиком crontab

Доступнее и проще объяснить работу чего-либо ни с помощью «сухой» теории, а с помощью конкретных примеров.


Поэтому давайте, к примеру, добавим новое задание на ежедневную загрузку в 7 часов утра бесплатной (для домашнего использования) антивирусной программы Dr.Web CureIt! в директорию /home/AntiVirus.


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


Будем полагать, что такой пользователь создан (к примеру, drweb) и все права доступа на директорию, где будет в дальнейшем хранится антивирус, выставлены. Можно этого и не делать.



  1. Для того, чтобы добавить новое задание в crontab от имени drweb, необходимо выполнить команду:
    sudo crontab -e -u drweb

    Где ключ -e говорит о том, что файл открыт для редактирования (edit), а ключ -u позволяет указать от имени какого пользователя будет происходит выполнение задания (user).


    Если Вы хотите запустить задание от имени своего пользователя, то указывать конкретного пользователя не обязательно.


Если Вы планируете выполнять задание от суперпользователя root или от любого другого, необходимо использовать sudo.


Если Вы до этого ни разу не пользовались crontab, то при первом обращении к нему Вам будет предложено на выбор несколько текстовых редакторов.


После этого уже непосредственно откроется текстовый файл.


  • Первым делом следует убедиться, что в самом начале файла присутствуют строки:

    SHELL=/bin/sh
    PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

    Возможно они не всегда нужны, но без них возможно придется писать полные пути к консольным командам. В Ubuntu 11.04 эти строки можно не вносить.


  • Ниже следует добавлять задания.

    Общая форма записи задания выглядит так:


    [минуты] [часы] [день] [месяц] [день недели] [команда]

    где

    [минуты] – это минуты для запуска (0-59);


    [часы] – это часы для запуска (0-23);


    [день] – это день месяца для запуска (1-31);


    [месяц] – это номер месяца в году для запуска (1-12);


    [день недели] – это день недели для запуска (0-6), где 0 – воскресенье;


    [команда] – это непосредственно команда-действие, которое нужно совершить в указанное время.


    Несколько уточнений:



    • Одно задание – одна строчка в файле.

    • Между параметрами может быть как пробел, так и табуляция.

    • Если какой-то из этих параметров должен включать в себя все возможные значения или этот параметр в данный момент не важен, то должен использоваться символ * (звездочка).

      К примеру, если есть необходимость выполнить задание каждый раз, когда наступает 30 августа 12.20, то первые 5 параметров будут 20 12 30 8 *, если, к примеру, нужно выполнять задание каждую субботу в 00.00, то 5 первых параметров будут 0 0 * * 6


    • Если Вам необходимо указать диапазон времени запуска, то нужно использовать [минуты]/period.

      К примеру, если необходимо запускать задание каждые 20-минут, то последние 5 параметров будут */20 * * * *, если каждый второй месяц в 00.00, то 0 0 * */2 *


    • Также диапазон можно обозначить и так 0 0 10-20 * *, т. е. задание будет выполняться каждый месяц с 10 по 20 число в 00.00

    • Если какой-то параметр имеет несколько значений, то значения можно перечислить через запятую.

      К примеру, запись 0 0 10,20 * * говорит о том, что задание будет выполняется 10 и 20 числа каждого месяца в 00.00

    • После добавления задания необходимо перевести курсор на новую строку, как бы дать понять cron`у, что это конец задания.
    В нашем случае c Dr.Web, необходимо добавить:
    0 7 * * * wget http://terrance.drweb.com/pub/drweb/cureit/setup.exe -O /home/AntiVirus/cureit.exe

    Если требуется совершить действие, которое не ограничивается выполнением одной команды, то необходимо создать файл (скрипт) и вызывать его исполнение в crontab.


    Для того, чтобы ваши задания взаимодействовали с графическим окружением нужно передать переменную DISPLAY. К примеру, если Вы хотите открывать каждый час музыкальный проигрыватель Rhythmbox, то строка задания должна быть:


    * */1 * * * export DISPLAY=:0; rhythmbox;

  • Чтобы убедиться в том, что все данные были внесены верно, можно выполнить команду crontab с ключом -l (маленькая английская л), то есть:
    sudo crontab -l -u drweb



  • После сохранения изменений в файле, данные будут перенесены в конфигурационный файл /var/spool/cron/crontabs/drweb и будут ждать своего исполнения.

    Как работает crontab?


    Чтобы окончательно внести ясность в работу этого демона, давайте разберем как же работает cron.


    Демон cron или crond чаще всего устанавливается в операционной системе Linux по умолчанию в независимости от дистрибутива. Этот демон каждую минуту обращается к списку заданий и проверяет не нужно ли что-нибудь выполнить.


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


    В cron есть несколько таких списков заданий:



    • /etc/crontab – основной файл;

    • и файлы лежащие в /var/spool/cron/crontabs


    В основном конфигурационном файле не принято добавлять пользовательские задания. Там находятся системные задания, хотя никто не мешает открыть этот файл для редактирования:


    sudo nano /etc/crontab

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


    0 7 * * * drweb wget http://terrance.drweb.com/pub/drweb/cureit/setup.exe -O /home/AntiVirus/cureit.exe

    Для добавления пользовательских задач правильнее использовать файлы, находящиеся в /var/spool/cron/crontabs, получить доступ к которым можно по выше приведенным командам в пункте №1, либо при прямом их редактировании.


    В директории /var/spool/cron/crontabs содержатся файлы, имена которых должны совпадать с именами пользователей.

    Crontab в умелых руках – это очень мощный инструмент, который может взять «в узду» наше Будущее и сделать работу системного администратора намного эффективнее и удобнее.

    Зарубин Иван Эксперт по Linux и Windows

    Парашютист со стажем. Много читаю и слушаю подкасты. Люблю посиделки у костра, песни под гитару и приближающиеся дедлайны. Люблю путешествовать.

    Вдохновлен

    Комментарии (2)

    • А в графическом исполнении есть планировщик для Linux ? Что то только одна консоль!

    • Не совсем понятно, почему переменная DISPLAY=:0; пишется именно в таком виде – с нулем и двоеточием перед ним.