Планирование задач с помощью at и cron в Linux

CompTIABeginner
Практиковаться сейчас

Введение

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

Вы начнете с подготовки лабораторной среды, убедившись, что службы at и cron установлены и активны. Затем вы попрактикуетесь в создании разового задания с помощью команды at и управлении очередью задач через atq и atrm. В завершение вы воспользуетесь командой crontab для создания, проверки и удаления повторяющегося задания cron, что даст вам практический опыт автоматизации рутинных задач системного администрирования.

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

Подготовка лабораторной среды

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

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

sudo apt-get update

Вы увидите процесс загрузки списков пакетов из репозиториев.

Затем установите пакет at с помощью команды apt-get. Флаг -y автоматически подтверждает установку, поэтому система не будет запрашивать ваше согласие.

sudo apt-get install -y at

В терминале отобразится ход установки. Как только процесс завершится, команда at станет доступна в системе.

Работа команды at зависит от фоновой службы (демона) под названием atd, которая исполняет запланированные задания. Нам нужно убедиться, что эта служба запущена. Проверить её статус можно командой systemctl.

sudo systemctl status atd

В выводе должно быть указано, что служба active (running).

● atd.service - Deferred execution scheduler
     Loaded: loaded (/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
     Active: active (running) since <date_time>; <time_ago>
       Docs: man:atd(8)
   Main PID: <pid> (atd)
      Tasks: 1 (limit: 4622)
     Memory: 248.0K
        CPU: 11ms
     CGroup: /system.slice/atd.service
             └─<pid> /usr/sbin/atd -f

Если служба не активна, вы можете запустить её следующей командой:

sudo systemctl start atd

Наконец, давайте проверим, активна ли служба cron, так как она понадобится нам на последующих этапах.

sudo systemctl status cron

Вывод также должен показать статус active (running), подтверждая, что демон cron готов к обработке запланированных задач.

● cron.service - Regular background program processing daemon
     Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled)
     Active: active (running) since <date_time>; <time_ago>
       Docs: man:cron(8)
   Main PID: <pid> (cron)
      Tasks: 1 (limit: 4622)
     Memory: 1.1M
        CPU: 40ms
     CGroup: /system.slice/cron.service
             └─<pid> /usr/sbin/cron -f

Теперь, когда службы atd и cron запущены, ваша среда полностью готова к работе с планировщиками.

Планирование разового задания с помощью команды at

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

Давайте запланируем простую команду, которая создаст файл at_output.txt в вашем текущем рабочем каталоге (~/project). Мы настроим запуск через одну минуту.

Сначала вызовите команду at, указав желаемое время.

at now + 1 minute

После нажатия Enter приглашение командной строки изменится на at>. Это означает, что утилита ожидает ввода команд, которые вы хотите запланировать. Введите команду для создания файла и записи в него текста.

echo "The at job executed successfully." > ~/project/at_output.txt

Нажмите Enter после ввода команды. Чтобы завершить создание задания и выйти из режима ввода at>, нажмите Ctrl-D (удерживая клавишу Ctrl, нажмите D). Вы увидите подтверждение того, что задание запланировано, а также его номер и время выполнения.

warning: commands will be executed using /bin/sh
job 1 at Mon Jan 1 12:01:00 2024

Теперь нужно подождать одну минуту, пока задание сработает.

По истечении минуты вы можете убедиться, что задание было выполнено, проверив наличие файла at_output.txt. Используйте команду ls -l, чтобы увидеть сведения о файле.

ls -l ~/project/at_output.txt

Если задание прошло успешно, файл отобразится в списке.

-rw-r--r-- 1 labex labex 35 Jan  1 12:01 /home/labex/project/at_output.txt

Затем просмотрите содержимое файла с помощью команды cat, чтобы убедиться, что команда echo сработала правильно.

cat ~/project/at_output.txt

В терминале должен появиться следующий текст:

The at job executed successfully.

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

rm ~/project/at_output.txt

Вы успешно запланировали, проверили и удалили результаты разового задания с помощью команды at.

Управление ожидающими заданиями с помощью atq и atrm

На этом этапе вы научитесь просматривать и отменять запланированные задания at. Часто бывает так, что после планирования задачи вы понимаете, что она больше не нужна или требует изменений. Команда atq позволяет просмотреть очередь ожидающих заданий, а команда atrm — удалить их.

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

at now + 10 minutes

В приглашении at> введите команду для создания файла. Назовем его temporary_job.txt.

touch ~/project/temporary_job.txt

Нажмите Enter, а затем Ctrl-D, чтобы сохранить задание. Система подтвердит создание и покажет номер задания. Запомните или запишите этот номер, так как он понадобится для удаления.

warning: commands will be executed using /bin/sh
job 2 at Mon Jan 1 12:10:00 2024

(Примечание: ваш номер задания и время будут отличаться.)

Теперь, чтобы увидеть список всех ожидающих заданий, воспользуйтесь командой atq (at queue).

atq

Вывод покажет ваше запланированное задание, его номер, дату и время запуска, очередь (a) и пользователя, создавшего задачу.

2 Mon Jan 1 12:10:00 2024 a labex

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

Замените <job_number> в команде ниже на ваш реальный номер задания. Например, если номер задания 2, введите atrm 2.

atrm <job_number>

Если удаление прошло успешно, команда ничего не выведет.

Чтобы убедиться, что задание удалено из очереди, снова запустите atq.

atq

На этот раз команда не должна ничего вывести. Это подтверждает, что очередь заданий at пуста и файл temporary_job.txt не будет создан.

Создание повторяющегося задания с помощью crontab -e

На этом этапе вы научитесь планировать периодические задачи с помощью cron. В отличие от at, который запускает задачу один раз, cron предназначен для многократного выполнения заданий по расписанию. Управление такими задачами происходит через специальный файл, называемый crontab.

Для редактирования файла crontab вашего пользователя используется команда crontab -e (флаг -e означает "edit" — редактировать).

Откроем файл crontab для внесения изменений.

crontab -e

Если вы запускаете crontab -e впервые, система может предложить выбрать текстовый редактор по умолчанию. Мы рекомендуем nano, так как он наиболее прост в освоении.

Select an editor. To change later, run 'select-editor'.
  1. /bin/nano        <---- easiest
  2. /usr/bin/vim.basic
  ...

Choose 1-2 [1]:

Введите 1 и нажмите Enter, чтобы выбрать nano. Откроется файл crontab. Он будет почти пустым, за исключением комментариев с инструкциями по использованию.

Запись в crontab имеет строго определенный формат из шести полей:
минута час день-месяца месяц день-недели команда

Символ звездочки (*) в поле времени работает как подстановочный знак, означающий "каждый". Для нашей задачи мы хотим запускать команду каждую минуту. Это удобно для тестирования, так как результат виден почти сразу. Расписание для запуска "каждую минуту" выглядит так: * * * * *.

Добавьте новую строку в конец файла, чтобы запланировать задание, которое будет дописывать текущую дату и время в лог-файл cron_log.txt в вашем рабочем каталоге.

* * * * * date >> ~/project/cron_log.txt

После добавления строки ваш редактор должен выглядеть примерно так:

## Edit this file to introduce tasks to be run by cron.
#
## Each task to run has to be defined through a single line
## indicating with different fields when the task will be run
## and what command to run for the task
#
## To define the time you can provide concrete values for
## minute (m), hour (h), day of month (dom), month (mon),
## and day of week (dow) or use '*' in these fields (for 'any').
#
## Notice that tasks will be started based on the cron's system
## daemon's notion of time and timezones.
#
## Output of the crontab jobs (including errors) is sent through
## email to the user the crontab file belongs to (unless redirected).
#
## For example, you can run a backup of all your user accounts
## at 5 a.m. every week with:
## 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
## For more information see the manual pages of crontab(5) and cron(8)
#
## m h  dom mon dow   command
* * * * * date >> ~/project/cron_log.txt

Чтобы сохранить файл и выйти из nano, нажмите Ctrl-X, затем Y для подтверждения изменений и Enter для записи файла.

После выхода в терминале появится подтверждение:

crontab: installing new crontab

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

Подождите хотя бы одну минуту. Затем проверьте, был ли создан лог-файл.

ls -l ~/project/cron_log.txt

Вы должны увидеть файл в списке.

-rw-r--r-- 1 labex labex 29 Jan  1 12:15 /home/labex/project/cron_log.txt

Теперь просмотрите его содержимое.

cat ~/project/cron_log.txt

Вывод покажет дату и время первого выполнения команды.

Mon Jan  1 12:15:01 UTC 2024

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

Проверка и удаление задания Cron с помощью crontab -l и -r

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

Сначала выведем список текущих активных заданий cron. Команда crontab -l (флаг -l от "list" — список) отображает содержимое вашего файла crontab прямо в терминале.

crontab -l

Вывод покажет задание, созданное на предыдущем шаге.

## Edit this file to introduce tasks to be run by cron.
## ... (прочие комментарии) ...
## m h  dom mon dow   command
* * * * * date >> ~/project/cron_log.txt

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

Теперь предположим, что это повторяющееся задание вам больше не нужно. Чтобы удалить его, используйте команду crontab -r (флаг -r от "remove" — удалить). Будьте очень осторожны: эта команда удаляет весь файл crontab вашего пользователя без дополнительного подтверждения.

Выполните команду для удаления вашего crontab.

crontab -r

При успешном выполнении команда ничего не выведет.

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

crontab -l

На этот раз команда вернет сообщение об ошибке, указывающее на отсутствие файла crontab.

no crontab for labex

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

Наконец, чтобы завершить лабораторную работу и очистить рабочее пространство, удалите файл cron_log.txt, созданный планировщиком.

rm ~/project/cron_log.txt

Вы успешно прошли весь цикл управления заданиями cron: от создания и проверки до полного удаления.

Резюме

В этой лабораторной работе вы научились подготавливать среду Linux для планирования задач, устанавливая пакет at и проверяя работу служб atd и cron. Вы попрактиковались в создании разовых заданий с помощью команды at. Также вы освоили управление очередью таких задач, используя atq для просмотра и atrm для удаления конкретных заданий.

Кроме того, вы изучили способы планирования повторяющихся задач с помощью cron. Вы использовали команду crontab -e для редактирования расписания пользователя и добавления новых автоматизированных заданий. Наконец, вы научились проверять список текущих задач cron с помощью crontab -l и полностью очищать расписание пользователя командой crontab -r.