Главная >> Инструкции >> Настройка Cron

Настройка Cron

Системным администраторам, да и обычным пользователям часто приходится автоматизировать различные задачи по обслуживанию и работе с Linux с помощью скриптов. Это очень удобно, вы просто запускаете скрипт, и он делает все что необходимо без вашего вмешательства. Следующий шаг в этом пути - настроить автоматически запуск нужного скрипта в нужное время.

Именно для этих задач в Linux используется системный сервис cron. Это планировщик, который позволяет выполнять нужные вам скрипты раз в час, раз в день, неделю или месяц, а также в любое заданное вами время или через любой интервал. Программа часто используется даже другими службами операционной системы. В этой статье мы рассмотрим как выполняется настройка Cron и разберем основные часто используемые примеры.

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

Фактически, Cron - это сервис, как и большинство других сервисов Linux, он запускается при старте системы и работает в фоновом режиме. Его основная задача выполнять нужные процессы в нужное время. Существует несколько конфигурационных файлов, из которых он берет информацию о том что и когда нужно выполнять. Сервис открывает файл /etc/crontab, в котором указаны все нужные данные. Часто, в современных дистрибутивах там прописан запуск утилиты run-parts, которая запускает нужные скрипты из следующих папок:

  • /etc/cron.minutely - каждую минуту;
  • /etc/cron.hourly - каждый час;
  • /etc/cron.daily - каждый день;
  • /etc/cron.weekly - каждую неделю;
  • /etc/cron.monthly - каждый месяц.

В этих папках должны находиться скрипты, которые нужно выполнять с указанным интервалом. Скрипты должны иметь права на выполнение и их имя не должно содержать точки. Это очень сильно облегчает работу с планировщиком для новых пользователей. Также в файле crontab прописан запуск команды anacron, которая работает так же как и cron, только предназначена для задач, которые нужно выполнять раз в длительный период, например, раз в день, неделю, месяц, год.

Она позволяет выполнять их даже если компьютер работает не всегда и время от времени выключается. Дата выполнения задания последний раз записывается в файл /var/spool/anacron, а затем, при следующем запуске anacron проверяет был ли запущен нужный процесс в нужное время, и если нет, то запускает его. Сам же сервис cron больше рассчитан на выполнение задач в течение дня или с точно расписанным временем и датой.

Настройка Cron

Для настройки времени, даты и интервала когда нужно выполнять задание используется специальный синтаксис файла cron и специальная команда. Конечно, вы всегда можете отредактировать файл /etc/crontab, но этого делать не рекомендуется. Вместо этого, есть команда crontab:

crontab -e

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

Поэтому тут нужно быть аккуратным, и если вам нужно выполнять скрипты от рута, то и crontab нужно выполнить от рута, а не от пользователя. Это часто становится причиной проблем.

Синтаксис crontab

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

минута час день месяц день_недели /путь/к/исполняемому/файлу

Нужно сказать, что обязательно нужно писать полный путь к команде, потому что для команд, запускаемых от имени cron переменная среды PATH будет отличаться, и сервис просто не сможет найти вашу команду. Это вторая самая распространенная причина проблем с Cron. Дата и время указываются с помощью цифр или символа '*'. Этот символ означает, что нужно выполнять каждый раз, если в первом поле - то каждую минуту и так далее. Ну а теперь перейдем к примерам.

Примеры настройки cron

Сначала можно посмотреть задачи cron для суперпользователя, для этого можно воспользоваться опцией -l:

crontab -l

Вы можете удалить все существующие задачи командой -r:

crontab -r

Давайте предположим, что нам нужно запускать от имени суперпользователя наш скрипт по адресу /usr/local/bin/serve. Какой-нибудь обслуживающий скрипт. Самый простой пример - запускать его каждую минуту:

* * * * * /usr/local/bin/serve

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

0 * * * * /usr/local/bin/serve

Еще дальше:

Запускаем в нулевую минуту нулевого часа, каждый день, это в 12 ночи:

0 0 * * * /usr/local/bin/serve

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

0 0 1 * * /usr/local/bin/serve

Можно в любой день, например, 15 числа:

0 0 15 * * /usr/local/bin/serve

В первый день недели первого месяца года, 0 часов 0 минут:

0 0 * 1 0 /usr/local/bin/serve

Или в нулевой день недели каждого месяца:

0 0 * * 0 /usr/local/bin/serve

Вы можете выбрать любую минуту, час и день недели, например, 15.30 во вторник:

30 15 * * 2 /usr/local/bin/serve

Понедельник считается первым днем, воскресенье - это седьмой или нулевой день. Еще можно писать сокращенное название дня недели, например sun - воскресенье:

30 15 * * sun /usr/local/bin/serve

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

0 7-19  * * * /usr/local/bin/serve

Если нужно запустить команду несколько раз, можно использовать разделитель ",". Например, запустим скрипт в 5 и 35 минут пятого (16:05 и 16:35), каждый день:

5,35 16  * * * /usr/local/bin/serve

Вы можете захотеть не указывать отдельно время, а просто указать интервал, с которым нужно запускать скрипт, например, раз в 10 минут. Для этого используется разделитель косая черта - "/":

*/10 * * * * /usr/local/bin/serve

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

  • @reboot - при загрузке, только один раз;
  • @yearly, @annually - раз год;
  • @monthly - раз в месяц;
  • @weekly - раз в неделю;
  • @daily, @midnight - каждый день;
  •  @hourly - каждый час.

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

@hourly /usr/local/bin/serve

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

sudo vi /etc/corn.daily/basckup

#!/bin/bash ......

Скрипт должен выглядеть подобным образом. Теперь вы знаете как настроить cron, осталось проверить как все работает.

Отладка работы

После того как вы настроили правила, еще хотелось бы проверить работают ли они. Для этого ждем того времени, когда скрипт уже должен быть выполнен и смотрим лог cron. Иногда он находится в /var/log/cron, а иногда пишется в syslog. Например, у меня в crontab есть такая строка:

Она должна выполняться в 19.40 каждый день, теперь смотрим лог:

grep CRON /var/log/syslog

И видим что в нашем логе она действительно есть и выполняется целиком успешно. Если бы были какие-либо ошибки, то тут же было бы выведено сообщение.

Если нужно проверить скрипт, который находится в одной из специализированных папок, то тут еще проще, просто запустите run-paths, передав ей в параметр нужную папку или даже сам скрипт:

sudo run-paths /etc/cron.daily/

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

×

Выводы

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

Оцените статью

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (38 оценок, среднее: 4,87 из 5)
Загрузка...
Creative Commons License
Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна .

22 комментария к “Настройка Cron”

  1. Может подскажет кто, в чём проблема? Есть скрипт, который содержит команду badblocks. Запускается в ручном режиме и нормально отрабатывает. Загоняю его в crontab -e 30 12 * * * /programs/scripts/badblocks.sh он запускается, но потом пишет sh: line 3: badblocks: команда не найдена.
    И вот как это понимать???

    Ответить
    • В статье написано что нужно указывать полный путь с корня дабы крон заметил команду. Не с домашней папки, а именно с корневой, которая /

      Ответить
  2. Для себя записываю 🙂
    Нужно проверять работает ли сервис и если упал запускать заново

    вообще строка выглядит так:
    test "$(systemctl is-active zoneminder)" = "inactive"; echo $?
    при запущенном сервисе выдает 1, при остановленном - 0
    Здесь 0 это true

    в crontab чтобы проверялось каждую минуту пишем:
    */1 * * * * root test "$(systemctl is-active zoneminder)" = "inactive" && service zoneminder restart

    Ответить
  3. здравствуйте!
    спасибо за статью!
    объясните пожалуйста, зачем тут писать путь- "@hourly /usr/local/bin/serve" если и так указано что запускать надо из папки "hourly"
    и еще, что такое "serve", это папка или файл?

    Ответить
    • serve - это пример, вместо него должен быть исполняемый скрипт (файл). Переменную @hourly надо использовать в crontab -e, если использовать папку, то её не надо (в папку нужно только поместить сам скрипт или ссылку на него).

      Ответить
  4. Здравствуйте,мне надо запускать скрипт rebootsv каждую минуту.
    Я записал через crontab -e вот так:
    SHELL=/bin/sh
    PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

    * * * * * root /root/server/rebootsv

    (Изначально файл был пуст)
    Файл сохранил.
    Но почему то у меня не чего не работает,помогите мне пожалуста.

    Ответить
  5. Неточные, неоднозначные комментарии к этим двум примерам. Лучше так:

    В каждый нулевой день недели (каждое воскресенье) первого месяца года, 0 часов 0 минут:

    0 0 * 1 0 /usr/local/bin/serve

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

    0 0 * * 0 /usr/local/bin/serve

    Ответить
  6. Добрый день.
    Скажите, почему выполняется cron ежедневно? хотя запись следующая:
    /bin/echo '0 12 * * 7 /opt/ghettovcb/bin/ghettoVCB.sh -f vms_to_backup -g /etc/ghettovcb/ghettoVCB.conf >>/dev/null 2>&1' >> /var/spool/cron/crontabs/root
    в логе:
    [root@Karr:~] grep ghetto /var/log/syslog.log
    2021-04-22T12:00:00Z crond[2443888]: USER root pid 2524867 cmd /opt/ghettovcb/bin/ghettoVCB.sh -f vms_to_backup -g /etc/ghettovcb/ghettoVCB.conf >>/dev/null 2>&1
    2021-04-22T12:00:00Z crond[2443888]: USER root pid 2524868 cmd /opt/ghettovcb/bin/ghettoVCB.sh -f vms_to_backup -g /etc/ghettovcb/ghettoVCB.conf >>/dev/null 2>&1
    2021-04-23T12:00:00Z crond[2443888]: USER root pid 2597775 cmd /opt/ghettovcb/bin/ghettoVCB.sh -f vms_to_backup -g /etc/ghettovcb/ghettoVCB.conf >>/dev/null 2>&1
    2021-04-23T12:00:00Z crond[2443888]: USER root pid 2597776 cmd /opt/ghettovcb/bin/ghettoVCB.sh -f vms_to_backup -g /etc/ghettovcb/ghettoVCB.conf >>/dev/null 2>&1

    Ответить
  7. Запись означает: каждое воскресенье в 12:00 дня. Если выполняется каждый день, да ещё и дважды, значит, в какой-то файл дважды добавлена совсем другая запись. Команда, которую вы указали, ведь добавляет строку, вот вы и добавили дважды похожую строку, но другую.

    Ответить
  8. У меня есть функция PHP, которую крон запускает, и, например, выполнение PHP занимает какое-то время на реализацию. Ну например 3 секунды идет активная работа функции.

    А вот сам крон, сколько и по каким критериям, что называется «держит» функцию запущенной?
    Если не совсем понятно, что я имею в виду, то поясню:
    Вот например, если мы запускаем функцию PHP вручную, то мы из браузера запускаем функцию и смотрим на экран, что происходит. Видим, что функция вывела итоговое сообщение и поняли, что можно закрывать браузер и идти пить кофе.

    А как себя поведет Крон в этом случае? Сколько он будет держать «открытой» нашу функцию.
    Такой вот вопрос.

    Ответить
    • Cron будет выполнять программу, пока интерпретатор php, запущенный кроном не завершится с кодом 0 (успех) или другим кодом ошибки. Если функция будет выполняться дольше интервала, то будет запущено несколько таких скриптов.

      Ответить
  9. Статья помогла, спасибо! Но мне интересно, почему если в скрипте сделать echo она не выводится на экран, только в лог файл?

    Ответить

Оставьте комментарий