Что такое крон linux

Использование планировщика cron в Linux

1. Введение

Если вы уже имеете некоторый опыт системного администрирования Linux, то должны знать, что такое cron и для чего он предназначен. Если же вы только начинаете работать с Linux, то эти знания вам пригодятся. Даже если вы уже изучали использование cron, данная статья поможет вам освежить знания.
Название cron происходит от Cronos, древнегреческого олицетворения времени. И это правильно выбранное имя, так как основным предназначением cron является помощь в планировании различных задач, которые система должна выполнить в заданное время. Если вы пользовались Windows, то вероятно вам приходилось копаться в утилите Scheduled Tasks. В целом назначение у программ аналогичное, но реализация разная. Cron предназначен для серьезных задач системного администрирования и обладает большей гибкостью. В качестве примера реальной задачи можно привести резервное копирование. Понравится ли вам вручную выполнять резервное копирование данных на нескольких сотнях машин? Думаю, нет. Вы просто пишете простой скрипт с использованием rsync, планируете его выполнение, например ежедневно, и забываете об этом. Все, что необходимо в дальнейшем — время от времени проверять логи. Некоторые даже используют cron для напоминания о важных личных событиях, например о днях рождения. Но cron — это просто демон, запускающий указанные вами задания. А имеется ли утилита, помогающая редактировать/добавлять/удалять эти задачи? Конечно имеется, и называется она crontab (от cron table). Однако будем двигаться вперед последовательно и начнем с инсталляции.

2. Инсталляция cron

Большинство дистрибутивов используют Vixie Cron и некоторые другие производные как дефолтную реализацию cron, и именно их мы будем рассматривать в этой статье. Кроме того, практически во всех дистрибутивах cron уже предустановлен, так как он является очень важной частью системы Linux. Хотя обычный пользователь, как правило, никогда не работает с ним напрямую, система и многие приложения используют cron (хорошим примером является периодическое обновление базы данных man-страниц). Значимым исключением является Gentoo, где необходимо вручную установить vixie-cron и добавить его в runlevel по умолчанию. В Arch, Debian, Slackware, Ubuntu, Fedora и OpenSUSE cron установлен по умолчанию и автоматически запускается при загрузке системы. Мы надеемся, что вы изучите man-страницы cron и crontab, так как во многих дистрибутивах используются их пропатченные версии, что делается для лучшей интеграции программы под конкретный дистрибутив. Поэтому существует вероятность, что функция, которая имеется например в Gentoo, будет недоступна в Slackware. В любом случае, нет ничего лучше чтения man-страниц, особенно если имеешь дело с новой программой, которую собираешься достаточно часто использовать.

3. Использование cron

Во-первых, мы должны убедиться, что cron запущен:

Если в выводе ничего не будет, проверьте, запущен ли cron, и добавьте его в службы, запускаемые по умолчанию, чтобы он стартовал при следующей загрузке. Как это сделать, зависит от дистрибутива. В системах Debian команда должна вывести примерно следующее:

Теперь заставим cron работать. Сначала необходимо подумать о том, какую команду мы будем использовать. Требует ли она привилегий root? Предположим, мы будем использовать crontab, чтобы добавить простой скрипт на выполнение через каждые пять минут как простой пользователь.

3.1. Crontab

3.1.1. Пример

Напишем простой скрипт, который будет выводить обычное диалоговое окно на базе curses в терминале (требуется dialog и любой эмулятор терминала — мы используем xterm):

Назовем файл crontest.sh и сделаем его исполняемым, так как все, что запускается с помощью cron, должно быть исполняемым:

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

-e ставится для редактирования, -r — для удаления. Будьте очень осторожны! Многие системные администраторы по неосторожности вводили -r вместо -e, тем более что эти клавиши расположены рядом, и удаляли все записи из crontab. В любом случае, скорее всего вы увидите полностью закоментированный файл (в crontab для обозначения комментариев используется #), в котором приведены примеры и описаны назначения полей записей. Да, запись состоит из полей, последнее из которых задает исполняемую команду, а остальные — временные характеристики. Итак, наша запись в crontab для скрипта, запускаемого каждые пять минут, выглядит следующим образом:

Нам необходимо экспортировать переменную DISPLAY, чтобы xterm не выдавал ошибки вида «DISPLAY is not set». Теперь посмотрим назначение каждого поля.

3.1.2. Поля crontab

Если вы работали ранее с символами для подстановки, то вам не составит труда освоить использование звездочки в crontab: она означает, что вместо нее подставляются все возможные значения поля. Поля по умолчанию в Linux (будьте внимательны, некоторые Unix-системы используют другие реализации cron) обозначают, слева направо: минуту, час, день месяца, месяц, день недели, год (необязательно) и исполняемую команду. Таким образом, если мы хотим, чтобы наш скрипт запускался каждые пять минут, каждый час, каждый день, каждый месяц и каждый год, наша запись должна выглядеть так:

Мы призываем вас быть осторожнее с полем дня недели: в вашей стране первым днем недели может быть понедельник, а в других странах им может быть воскресенье. Если работаешь в мультикультурной, многонациональной среде, необходимо помнить о культурных и религиозных особенностях. Cron отправляет уведомления пользователю, которому принадлежит запись, на его почтовый адрес по умолчанию ($user@$hostname). Если вы хотите изменить адрес электронной почты, просто добавьте «MAILTO=$email_address» в crontab. Если вы хотите отключить эту функцию, добавьте «>/dev/null 2>&1» в конец записи.
Теперь, если вы уже устали от всплывающего каждые пять минут окна, снова запустите crontab -e, чтобы удалить или, что проще, закомментировать запись. Чтобы просмотреть содержимое crontab, просто используйте опцию -l (list).

Читайте также:  Eset nod32 для windows x64

3.2. Взгляд на /etc/

3.2.1. Скрипты cron

В предыдущих разделах мы решали простые и тривиальные задачи, просто для разминки, а теперь мы уже займемся серьезными делами. Заголовок данного раздела относится к директориям в /etc, которые отвечают за периодические задачи по обслуживанию системы. Например, в директории /etc/cron.weekly имеется скрипт man-db, который обновляет базу данных man-страниц. Все подобные скрипты включены в состав дистрибутива и запускаются согласно файлу /etc/crontab. Поэтому, если вы хотите разобраться их работе, лучше всего изучить содержимое этого файла. Вы увидите записи, похожие на те, что мы делали ранее, но исполняемые команды будут отличаться. «run-parts» — это небольшая утилита, созданная для запуска всех скриптов в заданном каталоге.
Внимательный читатель может заметить, что в /etc/crontab имеется одно поле, которого мы не видели при редактировании своего crontab — это поле «user». Это сделано по соображениям безопасности. Если вы вводите команду crontab -e как $user, это значит, что любая команда запускается от имени $user. Но так как /etc/crontab относится ко всей системе, необходимо явно задавать пользователя, так как может потребоваться запускать определенные скрипты или программы от имени другого пользователя, а не от root, особенно если системный администратор заботится о безопасности и добавляет пользователей и группы в систему по мере необходимости. Пример: для резервного копирования не нужны все привилегии root, требуются только права на чтение и запись в определенные директории, поэтому администратор создает группу backup и пользователя backupadmin с необходимыми правами и запускает ночные скрипты резервного копирования с помощью записи:

Эта запись запускает скрипт nightlybkup.sh каждую ночь в 23:30. Если мы захотим запускать резервное копирование только с понедельника по пятницу, нужно отредактировать нашу запись:

Если вы захотите запускать резервное копирование только по понедельникам, средам и пятницам, замените «1-5» на «1,3,5». Когда вы точно знаете, что вам нужно, cron становится понятным и простым в использовании.

4. Размышления о безопасности

Существует множество ситуаций, когда вы не хотите, чтобы пользователь, имеющий доступ к вашей системе, имел возможность создавать записи crontab. Здесь в игру вступают файлы /etc/cron.deny и /etc/cron.allow. Их использование аналогично /etc/hosts.allow и /etc/hosts/deny, поэтому, если вы работали с этими файлами раньше, то будете чувствовать себя как дома. Этих двух файлов (cron.deny и cron.allow) по умолчанию нет в системе, по крайней мере на системе, в которой мы работаем, поэтому по умолчанию всем разрешено создавать записи в crontab. Вы можете проверить, какие файлы, относящиеся к cron имеются в вашем каталоге /etc с помощью команды:

И снова напоминаем, что все сказанное справедливо для Linux, так как отсутствие этих файлов на Solaris означает прямо противоположное, кроме того, файлы расположены в других местах. Сначала проверяется cron.allow, поэтому обычно мы вводим «ALL» в cron.deny, а затем добавляем пользователей, которым мы хотим предоставить доступ, в cron.allow.

5. Примеры использования cron

Команда будет выполняться каждую минуту, день и месяц.

Эта команда будет запускать скрипт checkdrive.sh в 02:30 каждое 10 число января, июня и декабря.

Только по выходным:

Команда будет выполняться каждый день в 11:20 и 16:20.

Каждый час в один конкретный день:

Команда будет запускаться каждый час каждое 2-е мая.

Каждые 10 минут во время пяти рабочих дней (понедельник — пятница):

Только в рабочее время:

Эта команда будет выполняться один раз в день с 9 до 17 часов.

Один раз в году, в полночь 1-го января:

Дважды в год в 12:00 и в 24:00

Эта команда будет исполняться дважды в год (каждые 6 месяцев) в 12:00 и в 24:00.

Каждый третий четверг любого заданного месяца в 10:00:

Каждый день через 20 минут после каждого четного часа:

Эта команда будет выполняться каждый день через 20 минут после каждого четного часа (0:20, 2:20. 22:20).

6. Заключение

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

Источник

Планирование рутинных задач Linux при помощи Cron и Anacron

Что такое Cron?

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

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

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

Читайте также:  Как узнать сколько памяти свободно linux

Руководство использует Ubuntu 12.04 VPS, но любой современный дистрибутив Linux работает таким же образом.

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

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

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

Если событие было запланировано, cron выполняет все предварительно заданные команды, а затем возвращается в фоновый режим до следующей минуты. Если событие не было запланировано, он ждет 60 секунд и проверяет файл снова.

Благодаря поминутному планированию этот инструмент очень гибок. После установки дистрибутива Linux cron уже сконфигурирован запускать множество задач.

Чтение Crontab

Cron решает, какие команды когда запускать, читая серии файлов под названием crontab. Общесистемный crontab можно просмотреть в «/etc/crontab»:

less /etc/crontab
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user command
17 * * * * root cd / && run-parts —report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts —report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts —report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts —report /etc/cron.monthly )

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

В файле есть несколько частей, в которых следует разобраться.

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

Остальная часть файла определяет фактические команды и планирование. Каждая строка в этом списке представляет собой запись или строку в таблице. «tab» в crontab означает «table» (таблица). Каждая ячейка таблицы разделена двоеточием или табами.

Закомментированная строка в верхней части таблицы подсказывает, что содержится в колонках:

# m h dom mon dow user command

Планирование часов и минут с Cron

Первая колонка содержит минуты (0-59) часа запуска команды. Вторая колонка содержит часы (0-23), в которые нужно запустить команду. Символ звездочки (*) означает «все возможные значения» и используется как шаблон.

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

25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts —report /etc/cron.daily )/code>

Это значит, что вторая строка должна быть запущена в 6:25 утра.

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

17 * * * * root cd / && run-parts —report /etc/cron.hourly

То есть, она будет запущена в 1:17, 2:17, 3:17, и т.д.

Планирование дней

Третья, четвертая и пятая колонки определяют дни, в которые должна быть запущена команда. Третья колонка указывает день месяца от 1 до 31(будьте осторожны при планировании дней в конце месяца, так как не все месяцы имеют одинаковое количество дней).

Четвертая колонка указывает, в котором месяце нужно запустить команду (1-12), а пятая указывает день недели со значениями от 0 до 7 (0 и 7 означают воскресенье). Пятая колонка дает возможность планировать по неделям, а не по месяцам.

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

Дни недели и месяца можно также указать при помощи первых трех букв их названий. Также можно указывать диапазоны при помощи дефиса (-) и устанавливать несколько значений через запятую.

Интервал можно указать, устанавливая после значения символ /, а затем число. К примеру, чтобы выполнять команду каждый второй час, нужно установить значение «*/2» в колонке часов.

Посмотрев в crontab, можно увидеть, что третья запись запускается каждое воскресенье в 6:47 утра:

47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts —report /etc/cron.weekly )

Четвертая строка запускается в первый день месяца в 6:52 утра:

52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts —report /etc/cron.monthly )

Горячие клавиши планирования cron

Первые пять столбцов каждой записи можно заменить горячими клавишами. Синтаксис: символ «@» с указанием имени интервала.

К примеру, можно спланировать запуск команды каждую неделю, указав @weekly вместо создания отдельного столбца конфигураций. Также можно использовать @yearly, @monthly, @daily и @hourly.

Также есть специальный ярлык @reboot, который запускается сразу после запуска cron. Как правило, это происходит только при запуске системы, и именно поэтому его называют restart, а не cron-restart или подобно.

Имейте в виду, что эти ярлыки не обеспечивают точного контроля времени своего запуска. Они запускаются в первый же момент совпадения времени.

К примеру, «@monthly» запускается в полночь первого дня месяца. Это может привести к тому, что многие команды, время запуска которых указано ярлыками, будут запущены в одно и то же время. Такие события нельзя контролировать так, как обычный синтаксис планирования.

Указывание команд и пользователей с Cron

Следующие столбцы касаются непосредственного выполнения запланированных команд.

Шестая колонка, которая находится только в системном crontab, называет пользователя, который должен выполнить команду.

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

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

Читайте также:  Как удалить трояна с компьютера windows 10

Использование команды run-parts и каталогов Cron

Если посмотреть на команды, указанные в системном crontab, можно увидеть упоминание о «anacron», который будет описан позже, и «run-parts».

Команда run-parts – это простая команда, которая запускает каждый исполняемый файл, расположенный внутри указанной директории. Она часто используется вместе с cron, поскольку это позволяет запускать несколько сценариев в указанное время, помещая их в одном месте.

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

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

К примеру, Ubuntu создает папки по имени «cron.daily», «cron.hourly», «cron.monthly» и «cron.weekly», в которых хранятся соответствующие скрипты.

Индивидуальные Crontab-файлы пользователя

Разобравшись с синтаксисом cron, можно использовать его для планирования задач пользователя. Это делается при помощи команды «crontab».

Поскольку команды в crontab пользователя будут запускаться с привилегиями данного пользователя, столбец «user» в индивидуальных crontab’ах не существует.

Чтобы увидеть текущий crontab, введите:

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

Чтобы сохранить резервную копию в домашнем каталоге, наберите:

Чтобы отредактировать crontab, наберите:

crontab -e
no crontab for demouser — using an empty one
Select an editor. To change later, run ‘select-editor’.
1. /bin/nano

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

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

К примеру, если бы в файле нужно было повторять (echo) команду «date» каждые 15 минут каждую среду, то нужно было бы внести такую строку:

*/15 * * * 3 echo «$(date)» >> /home/demouser/file

Затем можно сохранить файл, и, запустив «crontab –l», увидеть только что созданное правило:

crontab -l
. . .
. . .
*/15 * * * 3 echo «$(date)» >> /home/demouser/file

Если нужно отредактировать crontab конкретного пользователя, можно добавить опцию «-u username». Это можно сделать только как root или как пользователь с root-привилегиями.

К примеру, если нужно что-либо внести в crontab «root», используйте:

sudo crontab -u root -e

Использование Anacron

Один из самых больших недочетов Cron заключается в том, что он предполагает, что сервер или компьютер всегда включен. Если в установленное время выполнения задачи машина выключена, задача не будет запущена.

Это серьезная проблема для систем, которые не могут быть включены постоянно. Потому был разработан инструмент под названием anacron. Anacron значит «анахронический», и используется для устранения этого недочета cron.

Anacron использует не такие подробные параметры, как cron. Наименьший интервал, который существует в anacron – это день. Это значит, что anacron нужно использовать как дополнение к cron, а не как замещение его.

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

Утилита anacron, как и cron, имеет таблицу планирования. Она имеет соответственное название «anacrontab» и также находится в каталоге «/etc». Рассмотрим ее формат:

less /etc/anacrontab
# /etc/anacrontab: configuration file for anacron
# See anacron(8) and anacrontab(5) for details.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# These replace cron’s entries
1 5 cron.daily nice run-parts —report /etc/cron.daily
7 10 cron.weekly nice run-parts —report /etc/cron.weekly
@monthly 15 cron.monthly nice run-parts —report /etc/cron.monthly

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

Первый столбец определяет, как часто команда должна быть запущена. Значение указывается в виде интервала в днях. Значение «1» будет работать каждый день, а значение «3» – каждые три дня.

Второй столбец определяет отсрочку выполнения команды. Дело в том, что Anacron – не демон. Он запускается в одно и то же время. Данное поле позволяет расположить выполнение команд таким образом, чтобы не все команды были запущены в одно и то же время.

К примеру, первая строка запускается каждый день через 5 минут после запуска anacron:

1 5 cron.daily nice run-parts —report /etc/cron.daily

Следующая строка запускается каждую неделю через 10 минут после вызова anacron:

7 10 cron.weekly nice run-parts —report /etc/cron.weekly

Третья колонка содержит имя, по которому работа будет известна в сообщениях и лог-файлах Anacron. Четвертое поле – команда, запущенная в данный момент.

Как видно, anacron запускает некоторые из скриптов cron. Разные дистрибутивы обрабатывают это столкновение по-разному, отдавая предпочтение одной из команд и отключая действия другой.

К примеру, на Ubuntu «/etc/crontab» проверяет, доступен ли в системе anacron, и затем выполняет скрипты каталогов «cron.*» с помощью cron, если anacron не был найден.

Другие дистрибутивы указывают cron обновлять временные отметки Anacron при каждом запуске этих каталогов, чтобы anacron не выполнял их при запуске.

Итоги

Cron и anacron – очень полезные инструменты автоматизации процессов. Понимание того, как использовать их сильные стороны и обойти их слабости, позволяет использовать их легко и продуктивно.

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

Источник

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