Михаил Флёнов - Linux глазами хакера
3.5. Планирование задач
Очень часто возникает необходимость выполнить какую-либо операцию в определенное время. Раньше я надеялся на свою память и вручную выполнял команды. Но когда несколько раз произошла осечка — просто был слишком занят, чтобы обратить внимание на часы и выполнить нужные действия, — я переложил задачу по слежению за временем на компьютер. И действительно, зачем держать в голове то, что компьютер сделает лучше и точно в указанный срок?
А что если необходимо выполнять какие-то простые, но трудоемкие задачи после рабочего дня? Неужели придется оставаться на службе на всю ночь? Конечно же, нет. Компьютер может сам все сделать без вмешательства человека, главное правильно ему рассказать, что и когда надо выполнить.
3.5.1. Формирование задания
Самый простой, надежный и любимый хакерами способ решить проблему запуска в определенное время — это команда at. В простейшем случае формат ее вызова следующий:
at hh:mm dd.mm.yy
При отсутствии даты используется ближайшая возможная. Например, если время больше текущего, то будет установлена текущая дата, если меньше, — то следующий день, потому что сегодня эта команда уже выполниться не сможет.
Рассмотрим использование команды at на реальном примере, с которым вы можете столкнуться в жизни. Допустим, что в начале рабочего дня мы завели нового пользователя. Мы также знаем, что этот сотрудник будет работать до 12 часов. Если после этого времени забыть удалить учетную запись, то пользователь останется в системе, а это большая дыра в безопасности.
Для начала необходимо выполнить команду at, указав время 12:30. Я беру запас 20 минут на случай, если пользователь задержится в системе. Для этого выполните команду:
at 12:50
В ответ на это появится приглашение для ввода команд:
at>
Введите необходимые инструкции. Например, для удаления пользователя необходимо выполнить команду userdel и стереть соответствующий каталог:
userdel tempuser
rm -fr /home/tempuser
Подробней об управлении пользователями мы узнаем в гл. 4, а сейчас нужно довериться мне и просто использовать эти команды. Конечно же, в вашей системе сейчас нет пользователя tempuser, и команда не отработает, но нас интересует сам факт ее запуска в указанное время.
Наберите эти команды, в конце каждой из них нажимая клавишу <Enter>. Для завершения ввода используйте комбинацию клавиш <Ctrl>+<D>. В ответ на это вы должны увидеть текстовое сообщение, содержащее дату и время, в которое будет выполнена команда, и идентификатор задания. Сообщение будет выглядеть примерно следующим образом:
Job 1 at 2005-03-03 12:30
С помощью команды atq можно увидеть список заданий, поставленных в очередь. Например, результат может быть следующим:
1 2005-01-28 12:40 a root
2 2005-01-28 01:00 a root
3 2005-01-30 12:55 a root
В первой колонке стоит номер задания, им можно управлять. После этого выводится дата выполнения команды, и в последней колонке — имя пользователя, который создал задачу.
Теперь допустим, что необходимо выполнять в определенное время (после окончания рабочего дня) резервное копирование. А что если в какой-либо день сотрудники задержались на работе, и им необходимо выполнить операции, которые сильно загружают систему. В этом случае резервное копирование будет мешать их работе, и логичнее отложить запуск задания.
Для решения этой проблемы создавайте задачу командой batch. Если в момент выполнения задания сервер будет загружен, то работа будет начата, когда нагрузка на сервер будет минимальной, по умолчанию менее 0,8%.
3.5.2. Планировщик задач
Команда at достаточно проста и удобна, но ее задания выполняются однократно, а многие задачи администратора (то же резервное копирование) требуют многократного запуска. Допустим, что вы запланировали резервное копирование ежедневно в 10 часов вечера. Каждый день набирать команду at не очень интересно, это надоест через неделю работы и захочется как-то оптимизировать задачу. Создавать файл сценария тоже не слишком удобно, потому что необходимо не забывать его выполнять.
Проблема решается через использование программы cron. Для этого у вас должен быть установлен демон crond, а лучше, если вы включите его в автозагрузку.
Для работы с демоном crond используется программа crontab. Чтобы добавить новую запись в расписание, необходимо выполнить ее без параметров. В ответ на это появится пустая строка, в которой можно задавать шаблон даты и необходимую команду. В общем виде это выглядит как:
минуты часы день месяц деньнедели команда
День недели указывается числом от 0 до 7. На воскресенье указывают 0 и 7. Это сделано именно так, потому что в различных странах по-разному определяется начало недели — где-то с понедельника, а иногда с воскресенья. В первом случае удобно выставлять значения от 1 до 7, в другом — от 0 до 6.
Если какой-либо параметр не имеет значения, то вместо него необходимо поставить звездочку.
Теперь рассмотрим несколько примеров.
00 5 * * * /home/flenov/backup1_script
Здесь заполнены только часы и минуты. Так как остальные параметры не указаны, то команда будет выполняться ежедневно в 5, вне зависимости от дня недели, числа или месяца.
00 20 * * 1 /home/flenov/backup2_script
Эта команда выполняет тот же файл сценария каждый понедельник (день недели равен 1) в 20:00.
00 * * * * /home/flenov/backup3_script
Такая команда будет выполняться каждый час ровно в 00 минут.
Внимание!Если вы запустили программу crontab и, не введя команд, нажмете клавиши <Ctrl>+<D>, то все предыдущие задания сотрутся. Будьте внимательны, для выхода из программы без сохранения используйте только клавиши <Ctrl>+<C>.
Помимо этого, у сервиса cron есть несколько дополнительных директорий, упрощающих создание расписаний. Вот распределение выполняемых сценариев по каталогам:
□ /etc/cron.hourly — ежечасно;
□ /etc/cron.daily — ежедневно;
□ /etc/cron.weekly — еженедельно;
□ /etc/cron.monthly — ежемесячно.
Вроде все просто, но если сценарий выполняется еженедельно, то в какое время и в какой день недели? Все станет ясно, если посмотреть на конфигурационный для сервиса cron файл /etc/crontab. В нем есть следующие строки:
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 с параметром -е. В ответ на это запустится текстовый редактор, в котором можно корректировать записи. Кстати, если вы не работали с этим редактором, то могут возникнуть проблемы, потому что он достаточно специфичный. Тогда нажмите клавишу <F1> и воспользуйтесь справкой. Команды тоже вводятся необычно. По выходу из этого редактора изменения вступают в силу мгновенно, а чтобы закончить работу без сохранения изменений, наберите ":q!" и нажмите клавишу <Enter>.
В принципе, все задания cron хранятся в текстовом виде. Для каждого пользователя формируется свой crontab-файл в директории /var/spool/cron/файл. Имя созданного файла совпадает с именем пользователя.
Вот пример содержимого crontab-файла:
#DO NOT EDIT THIS FILE - edit the master and reinstall.
#(- installed on Thu Jan 27 13:55:49 2005)
#(Cron version--$Id:crontab.c,v2.13 1994/01/17 03:20:37 vixie Exp $)
10 * * * * ls
Вы можете редактировать его напрямую, без использования команды crontab -е.
3.5.3. Безопасность работ
Напоследок хочется добавить во все преимущества команды at ложку дегтя. Злоумышленники очень любят использовать эту инструкцию в своих целях. Например, хакер может завести учетную запись с максимальными правами. Затем настроить команду at так, чтобы после выхода она удаляла запись и чистила следы его пребывания в системе.
В каталоге /etc есть два файла, которые вы должны настроить:
□ at.allow — по умолчанию этого файла может и не быть. Если он существует, то только те пользователи, которые в нем прописаны, могут выполнять команду at;