Для выполнения конкретных задач по расписанию, или периодически, через равный промежуток времени (регулярных действий) в линуксе (да и вообще в UNIX-подобных ОС), существует утилита cron. Это программа-демон (служба, по аналогии с Windows), которая постоянно размещена и работает в оперативной памяти компьютера, сканируя раз в минуту список установленных задач на наличие актуальной для выполнения в текущий момент времени. Сами инструкции по запуску задач находятся в специально предназначенных crontab-файлах, которые, в свою очередь, находятся в строго отведённых каталогах системы.
Историческая справка
Утилита была разработана ещё в начале 70-х годов прошлого столетия, когда Кен Томпсон и Деннис Ритчи создали ОС UNIX. Они работали над проектом по созданию многозадачной и многопользовательской системы Multics, в котором принимали участие компании AT&T и Bell Labs. В то время подобная система была настолько высокотехнологичным и прорывным продуктом, что позже Bell Labs отказалась от активного участия в проекте из-за крайне низкой востребованности подобного рода систем для широкого потребления.
Однако, используя наработки из проекта Multics, Томпсон и Ритчи на этой основе и на волне энтузиазма создали ОС UNIX. Такая мощная и прорывная платформа для полноценного раскрытия своего функционала нуждалась в обеспечении её функционалом в виде специализированного ПО и утилит, одной из которых и по сей день является cron. Разработчиком утилиты является Кен Томпсон.
Функционал и основные компоненты примеры cron
Описания регулярных действий, запускаемых утилитой– это так называемая crontab-таблица, которая имеет строго определенный формат. Она состоит из 6 колонок, разделённых табуляторами или пробелами, первые 5 из которых определяют время запуска действия. Последняя колонка интерпретируется как команда запуска, т. е. само действие.
0 5 * * 1 tar -zcf var/backups/home.tgz /home/
Приведённое описание действия означает запуск резервного копирования (путём архивирования и помещения созданного архива в var/backups/) всех каталога /home каждую неделю (по понедельникам) в 5 утра. Как видно, сначала задаётся колонка минут, затем часов, дней, месяцев и дней недели. Далее следует команда запуска, в данном случае для создания архива. В колонках, определяющих время могут использоваться числа, группы чисел, разделяемых запятыми, диапазоны чисел, разделяемых дефисом, а также символы «*» и «/». Каждому действию соответствует строка описания в crontab-файле. В приведённом примере цифра «1» означает порядковый номер дня недели — понедельник, соответственно «2» — вторник, «3» — среда и т. д., причём воскресенье это «0» или «7». Символ «*» означает любое значение с учётом валидности для соответствующего параметра. Для задания шага значений используется символ «/», например:
23 */2 * * * echo "Выполняется в 0:23, 2:23, 4:23 и т. д."
Пример настройки планировщика на выполнение задачи каждые 5 минут выглядит так
*/5 * * * * echo "Выполняется каждые 5 минут"
Каждую минуту
*/1 * * * * echo "Выполняется каждую минуту"
Каждый час
* */1 * * * echo "Выполняется каждый час"
каждое первое число февраль, июль и ноябрь в 2.30
10 00 01 02,07,11 * echo "каждое первое число февраль, июль и ноябрь в 0.10"
Каждые полчаса:
00,30 * * * * echo "каждые полчаса"
По выходным
* * * * 6,7 echo "суббота и воскресенье"
трижды в день:
00 10,15,20 * * * echo "будет выполняться каждый день в 10.00 и 15.00, 20.00"
один раз в день с 00 до 09 часов по буднем.
00 00-09 * * 1-5 echo "будет выполняться с 00 до 09 часов по буднем"
Для добавления скрипта в крон нужно прописать полный путь к скрипту. Пример
00 01 * * * /etc/scripts/script.sh
В данном примере скрипт /etc/scripts/script.sh будет запускаться каждый день в час ночи. Существуют два типа crontab-файлов: системные и пользовательские. В отличие от пользовательских, в системных после колонок задания времени используется еще колонка для указания пользователя, от которого выполняется действие:
17 * * * * root cd / && run-parts —report /etc/cron.hourly
Кроме того, местоположение системных и пользовательских crontab-файлов различается: файлы, используемые для действий, управляющих системой находятся в /etc/cron.d/, а файлы, создаваемые для отдельных пользователей хранятся по адресу /var/spool/cron/crontabs/.
Для корректной работы утилиты необходимо в файлах crontab указывать оболочку командного интерпретатора, а также добавлять домашний каталог пользователя в PATH:
SHELL=/bin/sh PATH=/bin:/usr/bin:/home/paul/bin
При необходимости можно также указать электронный адрес пользователя:
MAILTO=user@example.org
Если в описании действия команда отправляет текстовое содержимое в стандартный вывод, то программа, при наличии электронного адреса, автоматически перехватит это сообщение и отправит по e-mail.
Использование cron
Файлы crontab нельзя редактировать вручную, т. к. это может вызвать сбой в цикле обработки этих файлов, когда демон сканирует их для анализа описаний действий. Для редактирования пользовательского файла crontab существует команда:
crontab -e
При первом своём запуске эта команда сначала предложит выбрать один из имеющихся в системе текстовых редакторов, после чего откроет файл для редактирования.
Для просмотра используемого в данный момент crontab-файла используется команда:
crontab -l
Для удаления:
crontab –r
Будьте аккуратны с этой командой, она удаляет всю таблицу задач без предупреждения!
Важно заметить, что команда «crontab -e» также используется для создания пользовательского файла. Сначала файл будет создан в каталоге /tmp/ и лишь позже cron самостоятельно скопирует его в каталог пользовательских crontab-файлов, задав ему имя соответствующего пользователя, т. е. того, кем он был изначально создан.
Не стоит пугаться директории /tmp/ — файлы crontab в ней не потеряются.
Некоторые особенности cron
Утилита обладает рядом особенностей, которые необходимо учитывать при работе с ней и составлении описаний регулярных действий:
- Минимальное время составляет одну минуту.
- Файл crontab должен всегда заканчиваться пустой строкой
- Условия времени запуска «день недели» и «день месяца» обрабатываются через логическую операцию «ИЛИ», все остальные условия — через логическое «И».
- Выводы запускаемых команд выводятся в виде сообщений пользователю, но если в файле crontab была определена директива MAILTO – сообщение будет отправлено по указанному в этой директиве e-mail.
Узнать, запущена ли в данный момент утилита крон, позволяет команда:
service cron status
или:
systemctl status cron
Для запуска и остановки можно также использовать:
service cron start service cron stop
и
systemctl start cron systemctl stop cron
Логи Cron
Логи по работе запуска программы в каждой системе хранятся по разному. Например в Centos это /var/log/crond, в Ubuntu /var/log/syslog. Так же, если не указанно MAILTO, вывод команд работы скриптов которые запускает крон, можно посмотреть в каталоге /var/spool/mail. В файле пользователя из под которого запускается программа.
Не могу найти нормальной статьи для чайников. Что я имею в виду: вот открываешь планировщик заданий в виндовс и что надо делать понятно с первого взгляда на программу. Утверждают, что линукс создан для бабушек и дедушек, но где же вы найдете таких, для которых все эти судо — мудо были бы понятны. Гуры, слабо повторить виндовский планировщик заданий?