Cron – планируем задания в Убунту

Стандартный

w256h2561383075021Documentscheduledtasksicon

Очень часто возникает необходимость выполнять нужные задачи в определенный период времени (периодическая очистка диска, запуск будильника, выключение компьютера по расписанию, и т.д.) Для этого в Linux, и в Ubuntu в частности, существует демон-планировщик Cron.

Что такое Cron и Crontab?

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

Для редактирования расписания crontab используйте следующую команду

crontab -e

Если редактор по умолчанию не определен, то вы увидите сообщение об ошибке:

/bin/sh: /bin/vi: No such file or directory
crontab: “/bin/vi” exited with status 127

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

export EDITOR=gedit

В данном случае будет использоваться редактор Gedit. Вместо Gedit можно использовать любой другой редактор, например vim, geany, emacs, nano, mcedit (нужно иметь установленный менеджер mc) и т.д.

Если будете редактировать в консольном редакторе nano, то нужно запомнить несколько комбинаций. После ввода нужной записи или команды надо ее сохранить. Для этого нажмем комбинацию клавиш – crtl+o, далее подтердим нажатием Enter. После всего выйдем из редактора комбинацией – ctrl+x.

Каждое задание пишем с новой строки.

Итак с редактором определились, и снова вводим команду:

crontab -e

Откроется ваш файл crontab.

Синтаксис для планирования задач довольно простой и нужно просто вникнуть в его суть.

* * * * * путь к команде или скрипту

Разберем назначение пяти снежинок.

Первая *: Минуты — интервал значений: 0-59
Вторая *: Часы — интервал значений: 0-23
Третья *: День — интервал значений: 1-31
Четвертая *: Месяц — интервал значений: 1-12
Пятая *: День недели — интервал значений: 0-7 (воскресенье имеет значение – 0 или 7, понедельник – 1, вторник – 2, и т.д.)



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

В самом конце впишите следующий текст:

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

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

Все скрипты, которые будем использовать, должны быть исполняемыми. Это можно сделать так: правой кнопкой по скрипту – Свойства – Права – ставим галочку “Разрешить выполнение файла как программы”, либо в Терминале:

chmod +x путь к нужному скрипту.sh

Теперь разберем несколько примеров для закрепления знаний.

Допустим, нужно выполнять скрипт time.sh каждый день в 6:00 вечера. Запись будет выглядеть таким образом:

0 18 * * * /home/user/time.sh

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

*/5 * * * 1

Данная запись будет выполнять скрипт time.sh каждые 3 часа по вторникам и пятницам:

0 */3 * * 2,5 /home/user/time.sh

Еще порция примеров:

выполнять задание один раз в час в 15 минут:

15 */1 * * * /home/user/time.sh

выполнять задание каждые 5 часов в 20 минут:

20 */5 * * * /home/user/time.sh

выполнять задание по средам в 6 часов 15 минут вечера:

15 18 * * 3 /home/user/time.sh

выполнять задание 12 февраля в 0 часов 1 минуту каждый год:

1 0 12 2 * /home/user/time.sh

выполнять задание в воскресенье 27 числа в 13 часов 47 минут:

47 13 27 * 0 /home/user/time.sh

выполнять задание каждый месяц 10 числа в 4 часа 10 минут:

10 4 10 * * /home/user/time.sh

выполнять задание каждую минуту:

* * * * * /home/user/time.sh

выполнять задание раз в час по будням:

0 * * * 1-5 /home/user/time.sh

выполнять задание каждый четный час:

* */2 * * * /home/user/time.sh

 

Дополнительные параметры Cron:

Переменная Описание Эквивалент
@reboot Запуск при загрузке
@yearly Раз в год 0 0 1 1 *
@annually Тоже что и @yearly
@monthly Раз в месяц 0 0 1 * *
@weekly Раз в неделю 0 0 * * 0
@daily Раз в день 0 0 * * *
@midnight В полночь (00:00)
@hourly Каждый час 0 * * * *

 

Пример: если нужно выполнять задание при входе в систему, то команда будет такой вид:

@reboot root /home/user/time.sh

Если нужно выполнить программу, которая имеет графический интерфейс, то после настройки времени-даты нужно вставить:

export DISPLAY=:0

Вся команда будет иметь следующий вид:

58 21 * * * export DISPLAY=:0 && /home/dm/My_Scripts/sleep.sh

Ваш crontab-файл будет находится в /var/spool/cron/crontabs/пользователь.

Посмотреть список всех заданных заданий в cron можно командой:

crontab -l

Чтобы установить задание от другого пользователя нужно выполнить следующую команду:

sudo crontab -e -u user

вместо user пишем нужное имя.

Более подробно о cron можно узнать тут – http://help.ubuntu.ru/wiki/cron или https://ru.wikipedia.org/wiki/Cron

Оказывается, что пользователи Windows, тоже могут использовать всю мощь планировщика задач – cron. Допустим можно запланировать проверку жесткого диска на наличие вирусов, к примеру антивирусом от Dr. Web. Вы можете скачать dr. Web CureIt на сайте download.net. Как оказалось, чтобы запустить cron в “винде”, нужно потратить немало времени и повозиться с настройками. Но нам это не грозит. В Убунту все работает “из коробки”.

На этом разрешите откланяться и простите за многобукаф.


7 Comments

  1. “выполнять задание в воскресенье 27 числа в 13 часов 47 минут:

    13 47 27 * 0 /home/user/time.sh”

    нужно переставить местами 13 и 47

  2. Здраствуйте, подскажите – создал файл

    # Edit this file to introduce tasks to be run by cron.
    #
    # Each task to run has to be defined through a single line
    # indicating with different fields when the task will be run
    # and what command to run for the task
    #
    # To define the time you can provide concrete values for
    # minute (m), hour (h), day of month (dom), month (mon),
    # and day of week (dow) or use ‘*’ in these fields (for ‘any’).#
    # Notice that tasks will be started based on the cron’s system
    # daemon’s notion of time and timezones.
    #
    # Output of the crontab jobs (including errors) is sent through
    # email to the user the crontab file belongs to (unless redirected).
    #
    # For example, you can run a backup of all your user accounts
    # at 5 a.m every week with:
    # 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
    #
    # For more information see the manual pages of crontab(5) and cron(8)
    #
    # m h dom mon dow command

    @reboot root /home/dell/display.sh

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

    после нажатия сохранить – gedit выводит красным “не удалось найти файл /tmp/crontab.150v8m/crontab”

    Что делать?

Leave a Reply

Статьи