Каким образом в среде unix linux можно запускать задачи по расписанию

Обновлено: 07.07.2024

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

Настроить cron можно несколькими способами. Самый простой и быстрый - указать задание руками в файл /etc/crontab. Проблема в том, что это может сделать только пользователь root.

Структура файла /etc/crontab представляет собой последовательность установок даты и времени, имени пользователя от которого выполняется задача и явное указание исполняемого файла.

m - минуты. Диапазон значений 0-59

h - часы. Диапазон значений 0-23.

dom - day of month - день месяца (число). Диапазон значений 1-31

mon - месяц. Диапазон значений 1-12

dow - day of week - день недели. указывается числом, где 0 - воскресенье, 6 - суббота.

user - пользователь от которого выполняется задача.

command - выполняемая задача.

Важно! Значения минут, часов, дней месяца, дней недели, а также месяца могут быть * (звездочкой) принимая все доступные значения. Также можно использовать список параметров разделенных запятой.

Примеры разберем подробнее немного позже.

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

Используется для редактирования или создания файла расписания для текущего пользователя

Вывод существующих задач в расписании пользователя

Удаление файла расписания текущего пользователя

crontab -u username

Работа с расписаниями указанных пользователей. Выполняется только от пользователя root

Для этого в консоли пишем команду:

Запустится редактор файла используемый по умолчанию (Ubuntu - nano/vi, FreeBSD - ee), в нашем случае mcedit из пакета Midnight Commander.


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

Сохраняем файл, выходим из редактора и проверяем список заданий crontab -l.


Проверим как работает удаление файла заданий - crontab -r.


Важно! Программа не спрашивает уверены ли вы в удалении файла заданий. Если нужно удалить конкретное задание, следует использовать crontab -e.

Для администратора важно, чтобы не все пользователи могли пользоваться планировщиком. Для этих целей можно использовать файлы /etc/cron.allow и /etc/cron.deny (в некоторых дистрибутивах эти файлы должны размещаться в /etc/cton.d). По умолчанию, использование cron разрешено всем пользователям.

Примеры использования в файле /etc/crontab.

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

*/5 * * * * root /root/scripts/script1.sh

В полдень и полночь:

0 */12 * * * root /root/scripts/backup.sh

Перезагрузка сервера в 0:00 в первый день месяца (исключительно как пример):

0 0 1 * * root reboot

Выполнение скрипта с понедельника по пятницу в полночь:

0 0 * * 1-5 root /root/script/backup_db.sh

* 0 * * 1-5 root /root/script/backup_db.sh

Ошибка в том, что скрипт будет запускаться с понедельника по пятницу каждую минуту с 0:00 по 0:59

В заданиях назначаемых через crontab -e (т.е. от текущего пользователя) не указывается параметр имени пользователя, в случае примеров - root.

На что еще следует обратить внимание:

Все пути до исполняемых файлов следует писать абсолютными.

Скрипты исполняются из корневой директории, а следовательно, при написании скрипта следует указывать рабочий каталог, либо абсолютные пути до целевых файлов (если в ходе работы скрипта генерируются файлы-отчета и им подобные)

В наших материалах посвященных Ubuntu Server время от времени затрагивается вопрос выполнения каких либо задач по расписанию. Чтобы не объяснять каждый раз одно и тоже мы решили создать данный материал, который должен помочь системным администраторам освоить и эффективно использовать планировщик задач в Linux.

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

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

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

При первом запуске утилита предложит выбрать редактор, мы рекомендуем выбирать mcedit (требует установленного mc), либо другой редактор, с которым вы умеете работать.

Формат строк расписания имеет вид:

  • Минута - время в минутах от 0 до 59
  • Час - от 0 до 23
  • День - день месяца от 1 до 31
  • Месяц - от 1 до 12 либо буквенные обозначения jan - dec
  • День недели - от 0 до 6 (0 - воскресенье) или sat - sun
  • Команда - строка в формате командного интерпретатора которая будет исполнена, допускается запись типа команда1 && команда2 для запуска нескольких команд подряд.

Значения минут, часов, дней можно указывать следующим образом:

  • Значение - число обозначающее дату или время, допускается подстановочный знак * допускающий полный диапазон значений
  • Несколько значений - допускается указывать несколько значений через запятую, например 2,14,22
  • Диапазон значений - указывается через дефис, например 2-10
  • Шаг значений - указывается через дробь, в знаменатель которой ставится шаг, например */3 - каждое третье значение 0, 3, 6, 9 и т.д. В качестве числителя должен быть диапазон значений либо звездочка.

Рассмотрим следующий пример записи:

Она означает что каждый второй час с 8 до 19 (8, 10,12,14,16) по понедельникам запускать скрипт test в домашнем каталоге Иванова.

Сразу хотим предостеречь вас от распространенной ошибки, при указании периодического исполнения все даты должны быть указаны явно, звездочка обозначает полный диапазон значений, а не их отсутствие. Например если вам требуется исполнять некий скрипт каждый час с 10 до 15 неправильно будет:

Данная строка приведет к запуску скрипта каждую минуту в диапазоне с 10 до 15 часов. Правильно будет:

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

Кроме даты можно использовать ряд специальных строк:

  • @reboot - выполнять команду при перезагрузке
  • @yearly или @annually - выполнять 1 января, аналогично записи: "0 0 1 1 * "
  • @monthly - выполнять 1 числа каждого месяца, аналогично "0 0 1 * * "
  • @weekly - выполнять каждое воскресенье, равносильно "0 0 * * 0"
  • @daily или @midnight - ежедневно в полночь,"0 0 * * * "
  • @hourly - раз в час, "0 * * * * "

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

Завершив составление расписания сохраняем файл и выходим из редактора. Пользовательское расписание будет сохранено в /var/spool/cron/crontabs под именем текущего пользователя.

Для системных и административных задач предусмотрен файл /etc/crontab синтаксис записей в нем отличается наличием дополнительного значения - пользователя, от чьего имени будет запущено задание:

Пример такой записи:

Согласно которой в 19:00 с понедельника по пятницу будет запускаться скрипт /etc/backup от имени пользователя root.

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

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

В предыдущих статьях мы учились проводить глобальный поиск по Сети на предмет уязвимых серверов, а также писать простые скрипты на BASH и Perl для выполнения различных исследовательских задач. А совсем свежее руководство было посвящено сканированию серверов на поиск уязвимости для Heartbleed.

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

К счастью Linux имеет встроенную функцию, которая позволяет выполнять такие задания по расписанию. Она называется cron или crond для демона, который запускает эти службы (демон — это просто процесс, работающий в фоновом режиме).

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

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

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

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

Шаг 1. Находим Crontab

Cron — это одна из тех функций, которая почти идентична для всех дистрибутивов Linux, поэтому то, что вы узнаете здесь, можно будет использовать в Ubuntu, Red Hat, Suse, Mint, Slackware, CentOS и других. Cron является частью семейства Linux/UNIX еще с 70-х годов, поэтому он проверен, широко используется и считается надежным инструментом, поскольку на деле доказал свою ценность.

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

Конфигурационный файл cron называется crontab или «cron table» («таблица cron»). Чтобы найти файл crontab, введите в консоли:

На скриншоте выше видно, что он находится в директории /etc, впрочем, как любой другой конфигурационный файл в Linux (есть исключения, конечно).

Шаг 2. Открываем crontab

Давайте откроем его и посмотрим что же у него внутри. Это делается с помощью любого текстового редактора, но в этой статье мы будем использовать графический текстовый редактор, устанавливаемый в Kali по умолчанию — Leafpad. Введите в консоли:

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

Шаг 3: Анатомия Crontab

Читать также: Как добавить функцию Face Unlock, реализованную в 5T OnePlus, на любой смартфон

После этих строк вы видите такую пару строк:

Первая из них определяет ту оболочку (shell), которая будет использована для запуска заданий. В нашем случае мы назначаем оболочку BASH командой, указанной после знака равенства. Если вы хотите использовать другую оболочку, вы можете определить ее явно в этой строке:

Вторая строка задает переменную PATH. Переменная PATH является переменной среды (в Windows тоже такое есть), которая сообщает системе, где ей искать команды, используемые в задании cron. Как правило, это файлы в директориях bin и sbin (бинарные, т.е. исполняемые файлы), которые содержат системные команды, используемые в Linux (ls, echo, ps, cd и другие).

Здесь значением по умолчанию является такая строка:

Это значит, что демон cron будет искать в этих директориях те команды, которые ему нужны для выполнения запланированных вами заданий. Если вы используете команду или файл, которой нет в этих директориях, то просто отредактируйте эту строку и добавьте нужную директорию после ввода двоеточия (:). Например:

Шаг 4. Определение задач по расписанию

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

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

Поля файла crontab следующие:

  • Minute — определенная минута, когда команда или задание будет запущено (0-59)
  • Hour — определенный час выполнения команды или задания (0-23)
  • Day of the Month — день месяца, когда будет запущена команда или задание (1-31)
  • Month — месяц выполнения команды или задания (1-12)
  • Day of the week — день недели выполнения команды или задания (0-6, воскресенье = 0)
  • User — пользователь, который разрешает выполнение этой команды или задания
  • Command — команда или задание, которое вы хотите запускать по расписанию
Читать также: Как использовать командную инъекцию, чтобы поднять reverse-шелл на веб-сервере

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

Использование Cron для поиска уязвимых серверов

Теперь давайте представим, что мы хотим просканировать весь Земной шар на предмет IP-адресов, уязвимых для Heartbleed.

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

Это идеальная задача для работы с cron!

Шаг 5. Определение расписания для нашего Heartbleed сканера

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

Давайте снова откроем crontab в любом текстовом редакторе.

Теперь нам нужно добавить только одну строку, чтобы запускать наш nmap-сканер каждую неделю в 2:05 ночи. Просто добавьте эту строку в ваш файл crontab:

Теперь сохраните и закройте этот файл.

Это запланирует запуск нашего nmap-сканера Heartbleed по понедельникам, вторникам, средам, четвергам и пятницам ровно в 2:05 ночи для поиска уязвимости Heartbleed по 65 536 IP-адресам.

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

После того, как расписания загружены в оперативную память, crond ежеминутно проверяет наличие записи в расписании, соответствующей текущему времени, и, если такая найдена, запускает указанную команду от имени указанного пользователя. Вывод команды (stdout и stderr) перехватывается и отправляется по почте, указанной в расписании. По умолчанию почта при выполнении пользовательского расписания отправляется локальному пользователю, а при выполнении общесистемного расписания – root'у.

Если crond обнаруживает изменение времени mtime у файла /etc/crontab или у одного из каталогов с расписаниями, то он автоматически заново считывает все файлы расписаний.

Формат расписания

Формат общесистемного расписания

Формат пользовательского расписания

mm hh DD MM DW – время выполнения в формате: минута час деньмесяца месяц деньнедели. Любое поле может быть записано следующим образом:

  • * – любое значение
  • 1-7 – интервал значений от и до
  • 0-10,20,30,40,50 – перечисление значений и интервалов
  • */10 – итерация с шагом, т.е. 0,10,20.
  • 0-10/2 – в промежутке с шагом

Месяц и день_недели задаются номером или первыми тремя буквами названия.

Переменные окружения, которые влияют на выполнение команды:

  • LOGNAME – имя пользователя (изменить нельзя)
  • HOME – домашний каталог, в котором будет запущена программа (по умолчанию из /etc/passwd)
  • SHELL – командный интерпретатор, которому будет передана на выполнение команда (по умолчанию из /etc/passwd)
  • MAILTO – почтовый адрес для отправки результата выполнения (по умолчанию локальному пользователю)

Редактирование личного расписания

crontab file – скопировать личное расписание из файла
crontab -e – запуск редактора vi для правки расписания
crontab -l – просмотреть расписание
crontab -r – удалить расписание

Пример личного расписания

Одноразовое выполнение действий по расписанию – at

Для однократного запуска команды в указанное время используется демон atd, задания для которого формируются командой at. Команда вводится со стандартного ввода или читается из файла. Время задаётся в различных форматах, например 16:00 31.12.2014 или "now +3 hours" (minutes, hours, days)

echo touch /tmp/test | at 14:35 – создать файл сегодня в 14:35, а если уже поздно, то завтра в указанное время
at -f file now + 14days – прочитать команду из файла и выполнить через две недели
atq – показать все назначенные задания
atrm id – удалить задание с номером id

Сервис anacron

Сервис anacron изначально придуман для персональных компьютеров, которые могут быть выключены в тот момент, когда crond должен был запустить очередную команду. Если anacron обнаруживает, что ежедневная, еженедельная или ежемесячная команда не была выполнена, то он осуществляет её запуск. Конфигурация anacron хранится в /etc/anacrontab в формате:

period delay job-identifier command

где
period – периодичность выполнения команды в днях
delay – если за указанный период команда не выполнялась, то делается задержка delay минут и запускается команда
job-identifier – произвольная текстовая строка для записи в лог-файлы
command – выполняемая команда

Типичный файл /etc/anacrontab (run-parts – выполнить все файлы в каталоге):

В результате переноса долгопериодных действий в anacron, в CentOS 6 существенно изменилось содержание /etc/crontab

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