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

at hh:mm dd.mm.yy

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

Рассмотрим использование команды at на реальном примере, с которым вы мо­жете столкнуться в жизни. Допустим, что в начале рабочего дня мы завели нового пользователя. Мы также знаем, что этот сотрудник будет работать до половины первого. Если после этого времени забыть удалить учетную запись, то пользова­тель останется в системе, а это большая дыра в безопасности.

Для начала необходимо выполнить команду at, указав время 12:50. Я беру запас 20 минут на случай, если пользователь задержится в системе. Для этого выполните команду:

at 12:50

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

at>

Введите необходимые инструкции. Например, для удаления пользователя необхо­димо выполнить команду userdei и стереть соответствующий каталог:

userdei tempuser
rm fr /home/tempuser

Наберите эти команды, в конце каждой из них нажимая клавишу . Для за­вершения ввода используйте комбинацию клавиш +. В ответ на это вы должны увидеть текстовое сообщение, содержащее дату и время, в которое будет выполнена команда, а также идентификатор задания. Сообщение будет выглядеть примерно следующим образом:

Job 1 at 2005-03-03 12:50

С помощью команды atq можно увидеть список заданий, поставленных в очередь. Например, результат может быть следующим:

atq

В первой колонке стоит номер задания, им можно управлять. После этого выводит­ся дата и время выполнения команды, а в последней колонке — имя пользователя, который создал задачу.

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

Для решения этой проблемы создавайте задачу командой batch. Если в момент вы­ полнения задания сервер окажется сильно загружен, то работа будет начата, когда нагрузка на сервер станет минимальной — по умолчанию менее 0,8%.

Cron

Команда at достаточно проста и удобна, но ее задания выполняются однократно, а многие задачи администратора (то же резервное копирование) требуют многократ­ного запуска.

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

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

crontab

минуты часы день месяц деньнедели команда

День недели указывается числом от 0 до 7. На воскресенье указывают 0 и 7. Это сделано именно так, потому что в различных странах по-разному определяется на­чало недели: где-то с понедельника, а где-то с воскресенья. В первом случае удобно выставлять значения от 1 до 7, в другом — от 0 до 6.

Если какой-либо параметр не имеет значения, то вместо него необходимо поста­вить звездочку.

Теперь рассмотрим несколько примеров:

00 5 * * * /home/username/backupl_script

Здесь заполнены только часы и минуты. Так как остальные параметры не указаны, то команда будет выполняться ежедневно в 5 утра, вне зависимости от дня недели, числа или месяца.

00 20 * * 1 /home/username/backup2_script

Эта команда выполняет файл сценария каждый понедельник (день недели равен 1) в 20:00.

Q0 * * * * /home/username/backup3_script

Такая команда будет выполняться каждый час ровно в 00 минут.

Если вы запустите программу crontab и, не введя команд, нажмете комбинацию кла­виш <Ctrl>+<D>, то все предыдущие задания сотрутся. Будьте внимательны — для выхода из программы без сохранения используйте только комбинацию <Ctrl>+<C>.

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

  • /etc/cron. hourly — ежечасно;
  • /etc/cron.daily — ежедневно;
  • /etc/cron. weekly — еженедельно;
  • /etc/cron.monthly — ежемесячно.

Вроде все просто, но если сценарий выполняется еженедельно, то в какое время и в какой день недели? Все станет ясно, когда вы посмотрите на /etc/crontab — конфи­ гурационный файл сервиса cron. В нем есть следующие строки:

01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

В начале строки указывается время выполнения. Вы можете изменить его так, что сценарии из каталога /etc/cron.monthly начнут выполняться ежечасно. Так что назва­ния чисто символические и только по умолчанию. Они легко меняются.

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

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

Кстати, если вы не работали с этим редактором, то могут возникнуть проблемы, потому что он достаточно специфичный. Тогда нажмите клавишу и восполь­зуйтесь справкой. Команды тоже вводятся необычно. По выходе из этого редактора изменения вступают в силу мгновенно, а чтобы закончить работу без сохранения изменений, наберите : *q!* и нажмите клавишу **.

В принципе все задания cron хранятся в текстовом виде. Для каждого пользователя формируется свой crontab-файл в каталоге /var/spool/cron. Имя созданного файла совпадает с именем пользователя.

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

Безопасность запланированных работ

В каталоге /etc имеются два файла, которые вы должны настроить:

  • at.allow — по умолчанию этого файла может и не быть. Если он существует, то только те пользователи, которые в нем прописаны, могут выполнять команду at;
  • at.deny — в этом файле перечисляются пользователи, которым явно запрещен доступ к команде at.

Подобные файлы есть и для сервиса cron:

  • cron.allow— здесь описываются пользователи, которые могут работать с зада­ниями в cron;
  • cron.deny — в этом файле указываются пользователи, которым недоступен сер­вис cron.

Я не раз утверждал и буду повторять, что все настройки должны идти от запреще­ния. Сначала необходимо все запретить, а потом позволить только то, что действи­тельно необходимо, и лишь тем пользователям, которым посчитаете это нужным. Именно поэтому не стоит пытаться внести всех пользователей в список at.deny.

Если вы не запускаете планировщики at и cron, то я рекомендую убрать сервис crond из автозапуска, а лучше даже вовсе удалить его с сервера. Вы не сможете контролировать то, чем не пользуетесь, потому что не будете обращать на это вни­мание.

В каталоге /etc имеется файл crontab, в котором находятся все настройки сервиса cron. Я рекомендую внести в начало этого файла следующую директиву:

CRONLOG=YES

Это позволит записывать в журнал команды, которые выполнялись в cron. Журнал сервиса находится в файле /var/cron/log. Если что-то произойдет без вашего ведома, то это можно будет определить по журналу.

WWW

Сайт crontab.guru очень силь­но упро­щает работу с crontab.

⤧  Previous post Процессы в Linux ⤧  Next post Настройка сети Linux