Планировщики задач Linux
Самый простой, надежный и любимый способ решить проблему запуска в определенное время — это команда 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 с параметром -е. В ответ на это запустится текстовый редактор, в котором можно корректировать записи.
Кстати, если вы не работали с этим редактором, то могут возникнуть проблемы, потому что он достаточно специфичный. Тогда нажмите клавишу
В принципе все задания 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.