✔ CentOS 7: Настройка cron.

Содержание:

1. Описание утилиты и ее установка.
2. Шаблон cron-заданий.
3. Примеры cron-заданий.
4. Готовые cron-задания.
5. Настройка cron для web-программистов.
6. Настройка cron для системных администраторов.
7. Список всех задач cron у всех пользователей.
8. Отладка работы cron.
9. Файлы справи и помощи по cron.
10. Cron калькулятор.
11. Житейские примеры из практики.
12. Оригиналы источников информации.


1. Описание утилиты и ее установка.

Cron — классический демон, использующийся для периодического выполнения заданий в определённое время. Регулярные действия описываются инструкциями, помещенными в файлы crontab и в специальные каталоги.

Посмотреть версию своего cron можно с помощью команды:

# sudo rpm -q cronie

Если он не установлен, вы можете использовать yum, чтобы установить его.

# sudo yum -y install cronie

Задания cron выбраны службой crond. Для того, чтобы проверить, работает ли услуга crond на вашем CentOS 7, вы можете использовать следующую команду:

# sudo systemctl status crond.service -l

Для реализации данного способа требуется внести задачу скрипта skript.sh в каталоге /sh/skriptiki/ на исполнение в программу cron на сервере CentOS 7

Проверим, работает ли у нас вообще cron в фоновом режиме?

# ps -ef | grep cron

Открываем файл заданий cron:

# mcedit /etc/crontab

Добавляем строки по смыслу общего синтаксиса в файле.

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

# sudo systemctl restart crond.service

2. Шаблон задания.

Шаблон задания для cron выглядит примерно так:

  • Минуты (0-59);
  • Часы (0-24);
  • День месяца (1-31);
  • Месяц (1-12);
  • День недели (0-6);
  • Команда.

Формат cronjob-выражения:

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

Звёздочками обозначены конкретные блоки времени.

Для отображения содержимого crontab-файла текущего пользователя используйте команду:

# crontab -l

Для редактирования заданий пользователя есть команда:

# crontab -e

Чтобы изменить crontab-файл другого пользователя (например, bitrix):

# crontab -u bitrix -e

Команда для очистки всех заданий текущего пользователя:

# crontab -r

3. Примеры cron-заданий.

Ниже приведены несколько примеров cron-заданий:

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

* * * * * <исполняемая-команда>

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

*/5 * * * * <исполняемая-команда>

3.3. Вызывать команду 4 раза в час (каждые 15 минут):

*/15 * * * * <исполняемая-команда>

3.4. Чтобы выполнить команду каждый час в 30 минут, пишем:

30 * * * * <исполняемая-команда>

То есть команда будет выполняться не каждые 30 минут, а тогда, когда значение минут будет равно 30 (например, 10:30, 11:30, 12:30 и так далее).

3.5. Значения времени можно комбинировать, перечислив их через запятую. Следующий код будет выполнять команду три раза в час: в 0, 5 и 10 минут.

0,5,10 * * * * <исполняемая-команда>

3.6. Выполнять команду каждый час будет следующее задание:

0 * * * * <исполняемая-команда>

3.7. Выполнение команды каждые два часа:

0 */2 * * * <исполняемая-команда>

3.8. Чтобы выполнять команду каждый день00:00):

0 0 * * * <исполняемая-команда>

3.9. Выполнение команды каждый день в 03:00:

0 3 * * * <исполняемая-команда>

3.10. Выполнение команды каждое воскресенье (sunday):

0 0 * * SUN <исполняемая-команда>

3.11. Другой вариант задания, которое будет выполнять команду каждое воскресенье (естественно, тоже в 00:00):

0 0 * * 0 <исполняемая-команда>

3.12. Выполнение команды каждый день с понедельника по пятницу:

0 0 * * 1-5 <исполняемая-команда>

3.13. Следующее задание будет выполнять команду каждый месяц, 1-го числа в 00:00:

0 0 1 * * <исполняемая-команда>

3.14. Выполнять команду в 16:15 каждого первого числа месяца будет это задание:

15 16 1 * * <исполняемая-команда>

3.15. Выполнение команды каждые три месяца:

0 0 1 */3 * <исполняемая-команда>

3.16. Выполнение команды в строго определённое время и месяц:

5 0 * 4 * <исполняемая-команда>

3.17. Задание будет вызывать команду в начале каждого полугодия00:00 1-го дня):

0 0 1 */6 * <исполняемая-команда>

3.18. Выполнение команды каждый год 1-го января в 00:00:

0 0 1 1 * <исполняемая-команда>

4. Готовые cron-задания.

@reboot <запускать при начальной загрузке сервера>;
@yearly <заменяет ‘0 0 1 1 *‘, то есть ‘ежегодно в 00:00 1 января‘>;
@annually <тоже что и yearly>;
@monthly <заменяет ‘0 0 1 * *‘ то есть ‘ежемесячно в 00:00 1 числа‘>;
@weekly <заменяет ‘0 0 * * 0‘ то есть ‘еженедельно в 00:00 воскресенье‘>;
@daily <заменяет ‘0 0 * * *‘ то есть ‘ежедневно в 00:00‘>;
@midnight <тоже что и daily>;
@hourly <заменяет ‘0 * * * *‘ то есть ‘ежечасно в 00 минут‘>.

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

@reboot <исполняемая-команда>

5. Настройка cron для web-программистов.

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

Набираем:

# crontab -e

И добавляем (будет выполняться под тем пользователем под кем вы зашли в SSH):

*/1 * * * * /usr/bin/php -q /server/cron/cron.php > /dev/null 2>&1

Сохраняемся,  SHIFT+Z 2 раза.

Где:

  • */1 * * * * — означает что скрипт будет запускаться каждую минуту;
  • > /dev/null — означает отправку результатов, которые выдаст скрипт, в никуда;
  • 2>&1 — избавляет администратора сервера от писем, если скрипт закончит работу с ошибками.

5.2. Для отправки на почту воспользуемся postfix.

Как сделать возможность получать письма с сервера описано в статье: «CentOS 7: Postfix 3 для отправки электронной почты с внутреннего системного «почтового ящика».

Набираем:

# crontab -e

И добавляем (будет выполняться под тем пользователем под кем вы зашли в SSH):

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

0 0 * * 1-5 /usr/bin/bash /sh/hamsterden.ru-backup-day.sh > /tmp/backup-day.txt && mail -s "Site hamsterden.ru day rotate" admin@yandex.ru < /tmp/backup-day.txt

5.2.2. Выполнение команды сканирования открытых портов указанного IP-адреса по воскресениям с последующей отправкой файла результатов работы nmap по указанной почте:

0 0 * * SUN nmap -T4 -A -v 192.168.0.31 > /tmp/nmap.txt && mail -s "Nmap usage" admin@yandex.ru < /tmp/nmap.txt

5.2.3. Выполнение команды оценки занятого дискового пространства каждый день с последующей отправкой просто результатов работы nmap по указанной почте:

0 0 * * * df -h | mail -s "Disk usage" admin@mail.ru

Сохраняемся,  SHIFT+Z 2 раза.

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

5.3. Иногда надо запускать по cron скрипт который лежит уже на сайте (и использует окружение сайта).

Установим менеджер загрузок wget:

# yum -y install wget

Набираем:

# crontab -e

И добавляем (будет выполняться под тем пользователем под кем вы зашли в SSH):

*/5 * * * * /usr/bin/wget --no-check-certificate -O /dev/null https://www.linuxshop.ru/cronit.sh

Сохраняемся,  SHIFT+Z 2 раза.

Где:

  • wget — как бы выкачивает скрипт (что нам и нужно web-сервер его исполняет);
  • --no-check-certificate не проверять сертификат https;
  • -O /dev/null — не сохранять выкаченный файл на жесткий диск.

6. Настройка cron для системных администраторов.

Фактически, cron — это сервис, как и большинство других сервисов CentOS 7, он запускается при старте системы и работает в фоновом режиме. Его основная задача выполнять нужные процессы в нужное время. Существует несколько конфигурационных файлов, из которых он берет из них информацию о том что и когда нужно выполнять. Сервис открывает файл /etc/crontab (тут могут быть тоже прописаны задачи) и они не будут отображаться по команде crontab –l.

Так же существует anacron (anachronistic cron или асинхронный (анахроничный) cron) и его запуск и его задания тоже нужно учитывать, смотрите файл /etc/anacrontab и каталоги /etc/cron.daily/, /etc/cron.hourly/, /etc/cron.monthly/ и /etc/cron.weekly/.

Часто, в современных дистрибутивах там прописан запуск утилиты run-parts, которая запускает нужные скрипты из следующих папок:

  • /etc/cron.minutely — каждую минуту;
  • /etc/cron.hourly — каждый час  ещё cat /etc/cron.d/0hourly — тут настроен;
  • /etc/cron.daily — каждый день;
  • /etc/cron.weekly — каждую неделю;
  • /etc/cron.monthly — каждый месяц.

7. Список всех задач cron у всех пользователей.

К сожалению для системного администратора нет такого инструмента, так как задачи в CentOS 7 могут храниться в нескольких местах:

  1. Клиентский crontab (# crontab -u user -l)
  2. /etc/crontab — можно посмотреть cat /etc/crontab;
  3. /etc/anacrontab — можно посмотреть cat /etc/anacrontab;
  4. /etc/cron.d/  — cron считывает файлы в каталоге /etc/cron.d/;
  5. /etc/cron.daily/ — запуск всех скриптов один раз в день;
  6. /etc/cron.hourly/ — запуск всех скриптов один раз в час;
  7. /etc/cron.monthly/ — запуск всех скриптов один раз в месяц;
  8. /etc/cron.weekly/ — запуск всех скриптов один раз в неделю.

Иногда конкретные пользователи могут создавать задачи тоже, как описано в общих методах. Задания cron для конкретных пользователей расположены в /var/spool/cron/username. При создании задач для конкретных пользователей, вам не нужно указать имя пользователя в cron.

Для того чтобы пройти руками все клиентские crontab (# crontab -u user -l), можно автоматизировать для всех пользователей очевидно нужно взять список пользователей в системе из /etc/passwd и сделать для каждого пользователя:

# crontab -u USERNAME -l

, то есть:

# for user in $(cut -d':' -f1 /etc/passwd); do crontab -u $user -l; done

Недостаток этого решения очевиден:

  1. Нужно всегда помнить эту команду.
  2. Если у пользователя нет задач в планировщике то мы получим сообщение «no crontab for vasua» и таких сообщений может быть десятки если у вас много пользователей — это неудобно.
  3. Вывод информации неудобно читать.

Решение простое — создадим функцию allcrontab в файле ~/.bashrc для ввода информации в более удобном виде:

# Определим цвета вывода
red='\e[0;31m'
RED='\e[1;31m'
green='\e[0;32m'
GREEN='\e[1;32m'
NC='\e[0m'

# Определим нашу функцию вывода списка всех задач cron у всех пользователей
function allcrontab() {
  for user in $(cut -d':' -f1 /etc/passwd); do
   usercrontab=$(crontab -l -u ${user} 2>/dev/null)
   if [ -n "${usercrontab}" ]; then
      echo -e "${RED}====== Start crontab for user ${NC}${GREEN}${user}${NC} ${RED}======${NC}"
      crontab -l -u ${user} | sed '/ *#/d; /^ *$/d'
      echo -e "${RED}====== End crontab for user ${NC}${GREEN}${user}${NC} ${RED}========${NC}\n"
   fi
  done
}

Выполняем source ~/.bashrc или перелогиниваемся и выполняем в консоле allcrontab и видим красивый вывод списка всех задач cron у всех пользователей.

Но это не финишная прямая, а только начало, ведь опытный системный администратор знает, что кроме вывода списка заданий командой # crontab -u user -l есть еще задания планировщика в каталоге /etc/cron.d/ и это тоже нужно учитывать, потому что например панель хостинга ISPConfig сохраняет задания cron в каталоге /etc/cron.d/ с именами ispc_webXXX, где webXXX — это логин системного пользователя, например web30 и вывод # crontab -u web30 -l нам скажет «no crontab for web30», а на самом деле в файле /etc/cron.d/ispc_web30 может быть такая картина:

SHELL='/bin/sh'
*/2 * * * * web30 /usr/bin/php -f /var/www/mysite.ru/web/yii cron-origin/index

8. Отладка работы cron.

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

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

# sudo run-paths /etc/cron.daily/

Примерно вот так:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed

37 * * * * root run-parts /etc/cron.hourly
23 5 * * * root run-parts /etc/cron.daily
19 3 * * 0 root run-parts /etc/cron.weekly
23 0 6 * * root run-parts /etc/cron.monthly

9. Файлы справи и помощи по cron.

Для получения дополнительной информации вы можете проверить страницу man:

# man cron

, а также:

# man crontab

10. Cron калькулятор.

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

  • freeformatter.com — сайт с анкетой запуска заданий, заполняете анкету и получаете строку для cron.
  • crontab.guru — сайт для генерации случайного времени исполнения задания, нажали кнопочку — получили рандомную строку для cron.
  • sysmasters.net — обратный калькулятор, вводим в поле строку из cron и получаем расшифровку, что и когда будет исполняться.

11. Житейские примеры из практики.

Вариант записи в crontab:

# Cert Renewal
30 6 1 * * root /usr/local/bin/certbot-auto renew --post-hook "nginx -s reload" >> /var/log/le-renew.log

# Site hamsterden.ru day rotate
10 4 * * * root /usr/bin/bash /sh/hamsterden.ru-backup-day.sh > /dev/null 2>&1

# Site Nextcloud day rotate
50 4 * * * root /usr/bin/bash /sh/nextcloud-backup-day.sh > /dev/null 2>&1

# Site bnd59.ru week rotate
10 2 * * 0 root /usr/bin/bash /sh/bnd59.ru-backup-week.sh > /dev/null 2>&1

# Clean Trash Yandex.Disk
0 5 * * * root /usr/bin/bash /sh/mycleantrash.sh > /dev/null 2>&1

# Site airsoftperm.ru month rotate
# 10 5 2 * * root /usr/bin/bash /sh/airsoftperm.ru-backup-month.sh > /dev/null 2>&1

12. Оригиналы источников информации.

  1. ru.wikipedia.org «cron».
  2. linuxshop.ru «Настройка cron».
  3. andreyex.ru «Автоматизация системных задач с использованием cron на CentOS 7».

Читайте также: