Введение
В этой лабораторной работе вы получите практический опыт планирования задач в системах RHEL, используя различные инструменты. Вы научитесь планировать одноразовые задания с помощью команды at, управлять повторяющимися задачами, специфичными для пользователя, с помощью crontab, а также настраивать повторяющиеся задания для всей системы с использованием каталогов cron.
Кроме того, в этой лабораторной работе будут рассмотрены передовые методы планирования с использованием таймеров systemd для более надежной и гибкой автоматизации задач, а также продемонстрировано, как эффективно управлять временными файлами с помощью systemd-tmpfiles. К концу этой лабораторной работы вы будете хорошо владеть навыками выбора подходящего метода планирования для различных сценариев и эффективного управления автоматизированными задачами в среде RHEL.
Запланируйте одноразовое задание с помощью 'at'
В этом разделе вы узнаете, как запланировать однократное выполнение задания в будущем с помощью команды at. Команда at полезна для выполнения команд, которые не требуют повторного запуска. Мы запланируем простое задание, проверим его детали, а затем удалим его.
В этой лабораторной работе мы будем работать непосредственно с локальной системой, чтобы изучить планирование задач. Все команды будут выполняться в вашей текущей терминальной среде.
Давайте запланируем задание для вывода текущей даты и времени в файл с именем ~/myjob.txt в вашем домашнем каталоге. Мы запланируем его выполнение через 3 минуты:
at now + 3 minutes << EOF
date > ~/myjob.txt
EOF
Сообщение warning: commands will be executed using /bin/sh является нормальным. Вывод job N at ... указывает номер задания и запланированное время выполнения. Запишите номер задания, так как он вам понадобится позже.
Далее, давайте запланируем еще одно задание в интерактивном режиме. Этот метод полезен для ввода нескольких команд или более сложных скриптов. Мы запланируем задание для добавления "Hello from at job!" в файл ~/at_output.txt через 5 минут:
at now + 5 minutes
После ввода команды и нажатия Enter вы увидите приглашение at>. Введите свою команду, а затем нажмите Ctrl+d для завершения:
at > echo "Hello from at job!" >> ~/at_output.txt
at > Ctrl+d
Чтобы просмотреть задания, которые в настоящее время находятся в очереди at, используйте команду atq. Эта команда перечисляет все ожидающие задания at для текущего пользователя.
atq
В выводе будет показан номер задания, запланированное время, очередь и пользователь, который его запланировал.

Вы можете просмотреть команды, которые будет выполнять конкретное задание at, используя команду at -c, за которой следует номер задания. Замените N на один из номеров заданий, которые вы записали ранее.
at -c N
Эта команда отобразит скрипт оболочки, который at выполнит для этого задания. В выводе вы должны увидеть команду date > ~/myjob.txt или echo "Hello from at job!" >> ~/at_output.txt.
Наконец, чтобы удалить запланированное задание at, используйте команду atrm, за которой следует номер задания. Давайте удалим первое задание, которое мы запланировали. Замените N на номер вашего первого задания.
atrm N
После удаления задания вы можете снова использовать atq, чтобы убедиться, что оно больше не находится в очереди.
atq
Теперь вы должны увидеть только второе задание (если оно еще не выполнилось) или пустую очередь, если оба задания были удалены или выполнены.
На этом завершается первый шаг по планированию однократных заданий с помощью команды at.
Управление заданиями 'at'
На этом шаге вы глубже изучите управление задачами at, включая планирование задач с различными очередями и проверку их выполнения. Понимание очередей at может быть полезно для приоритизации задач или разделения различных типов одноразовых заданий.
Мы продолжим работать на локальной системе, чтобы изучить более продвинутые функции управления задачами at.
Команда at позволяет указать очередь с помощью опции -q. Очереди представляют собой одиночные буквы от a до z. Очередь a является очередью по умолчанию, а задачи в очередях от a до z выполняются с уменьшающейся приоритетностью (niceness). Очередь a имеет наивысший приоритет, а очередь z — наинизший. Очередь b зарезервирована для пакетных задач (batch jobs).
Давайте запланируем задачу в очереди g (очередь с более низким приоритетом) для выполнения через 2 минуты. Эта задача создаст файл с именем ~/queue_g_job.txt с временной меткой:
at -q g now + 2 minutes << EOF
date > ~/queue_g_job.txt
EOF
Вы увидите вывод, похожий на job N at .... Запишите этот номер задачи.
Далее, давайте запланируем еще одну задачу, на этот раз в очереди b (очередь пакетных задач), которая обычно используется для задач, которые могут выполняться при низкой нагрузке на систему. Эта задача добавит "Batch job executed!" в файл ~/batch_job.txt. Мы запланируем ее выполнение через 4 минуты:
at -q b now + 4 minutes << EOF
echo "Batch job executed!" >> ~/batch_job.txt
EOF
Снова запишите номер задачи.
Чтобы увидеть все ожидающие задачи, включая задачи в разных очередях, используйте atq.
atq
Теперь вы должны увидеть оба задания в списке с соответствующими буквами очереди (g и b).

Теперь подождите, пока ваши запланированные задачи выполнятся. Подождите не менее 5 минут, чтобы все задачи завершились. Вы можете проверить, существуют ли файлы, созданные вашими задачами at, и содержат ли они ожидаемое содержимое.
Проверьте ~/queue_g_job.txt:
cat ~/queue_g_job.txt
Вы должны увидеть строку с датой и временем.
Проверьте ~/batch_job.txt:
cat ~/batch_job.txt
Вы должны увидеть "Batch job executed!".
Если файлы отсутствуют или пусты, это может означать, что задачи еще не выполнились или возникла проблема с командой. Вы можете повторно проверить atq, чтобы увидеть, ожидают ли они выполнения.
На этом завершается шаг по продвинутому управлению задачами at. Оставшиеся задачи at будут автоматически удалены при уничтожении контейнера.
Планирование повторяющихся заданий пользователя с помощью 'crontab'
На этом шаге вы научитесь планировать повторяющиеся задачи для конкретного пользователя с помощью crontab. В отличие от заданий at, которые выполняются один раз, задания cron выполняются многократно с заданными интервалами. Это идеально подходит для регулярного обслуживания, резервного копирования данных или генерации отчетов.
Мы продолжим работать на локальной системе, чтобы изучить управление пользовательскими crontab.
Команда crontab позволяет пользователям создавать, редактировать и просматривать свои собственные задания cron. У каждого пользователя есть свой файл crontab.
Чтобы отредактировать свой файл crontab, используйте команду crontab -e. Это откроет ваш файл crontab в редакторе текста по умолчанию (обычно vim).
crontab -e
Инструкции по работе с редактором Vim:
- Нажмите
i, чтобы войти в режим вставки (внизу вы увидите-- INSERT --) - Используйте клавиши со стрелками для навигации
- Чтобы сохранить и выйти: Нажмите
Esc, чтобы выйти из режима вставки, затем введите:wqи нажмитеEnter - Чтобы выйти без сохранения: Нажмите
Esc, затем введите:q!и нажмитеEnter
В редакторе вы добавите новую строку для определения вашего задания cron. Запись cron состоит из пяти полей времени и даты, за которыми следует команда, которая должна быть выполнена. Поля:
- Минута (0-59)
- Час (0-23)
- День месяца (1-31)
- Месяц (1-12)
- День недели (0-7, где 0 или 7 — воскресенье)
Вы можете использовать * в качестве подстановочного знака, означающего "каждый" для поля, или / для указания шаговых значений (например, */5 для каждых 5 минут).
Давайте запланируем задание, которое каждую минуту добавляет текущую дату и время в файл с именем ~/my_cron_log.txt. Это позволит нам быстро наблюдать за работой задания cron.
Выполните следующие шаги в vim:
- Нажмите
i, чтобы войти в режим вставки - Добавьте следующую строку в файл
crontab:
* * * * * /usr/bin/date >> ~/my_cron_log.txt
- Нажмите
Esc, чтобы выйти из режима вставки - Введите
:wqи нажмитеEnter, чтобы сохранить и выйти
Вы должны увидеть сообщение, указывающее, что новый crontab установлен:
crontab: installing new crontab
Чтобы убедиться, что ваше задание cron успешно добавлено, вы можете просмотреть свои записи crontab, используя команду crontab -l:
crontab -l
Вы должны увидеть строку, которую вы только что добавили:
* * * * * /usr/bin/date >> ~/my_cron_log.txt
Теперь подождите минуту или две, чтобы задание cron выполнилось хотя бы один раз. Вы можете проверить текущее время, чтобы увидеть, когда наступит следующая минута:
date
Подождав не менее двух минут, чтобы задание cron выполнилось несколько раз, проверьте содержимое файла ~/my_cron_log.txt.
cat ~/my_cron_log.txt
Вы должны увидеть одну или несколько строк, каждая из которых содержит дату и время, указывающие на то, что ваше задание cron выполнилось.
Mon Apr 8 10:30:01 AM EDT 2024
Mon Apr 8 10:31:01 AM EDT 2024

На этом завершается шаг управления пользовательскими crontab. Задание cron будет продолжать выполняться до тех пор, пока контейнер не будет уничтожен.
Управление записями 'crontab' пользователя
В этом шаге вы изучите более продвинутые методы управления записями crontab пользователя, включая редактирование существующих заданий, добавление нескольких заданий и понимание специальных строк cron. Эффективное управление crontab имеет решающее значение для автоматизации рутинных задач.
Мы продолжим работу в локальной системе, чтобы изучить продвинутые методы управления crontab.
Начнем с добавления нового задания cron. Это задание будет добавлять "Hello from cron!" в ~/cron_messages.txt каждые две минуты.
Откройте свой crontab для редактирования:
crontab -e
В vim:
- Нажмите
i, чтобы войти в режим вставки - Добавьте следующую строку в файл
crontab:
*/2 * * * * echo "Hello from cron!" >> ~/cron_messages.txt
- Нажмите
Esc, чтобы выйти из режима вставки - Введите
:wqи нажмитеEnter, чтобы сохранить и выйти
Проверьте, что запись добавлена:
crontab -l
Вы должны увидеть только что добавленную строку.
Теперь давайте добавим еще одно задание cron, которое запускается ежедневно в 08:00 утра. Это задание будет записывать использование диска вашего домашнего каталога в ~/disk_usage.log.
Откройте свой crontab для редактирования снова:
crontab -e
В vim:
- Нажмите
i, чтобы войти в режим вставки - Добавьте следующую строку под предыдущей:
0 8 * * * du -sh ~ >> ~/disk_usage.log
- Нажмите
Esc, чтобы выйти из режима вставки - Введите
:wqи нажмитеEnter, чтобы сохранить и выйти
Проверьте наличие обеих записей:
crontab -l
Теперь вы должны увидеть оба задания cron в списке.
cron также поддерживает специальные строки, которые могут упростить общие расписания. К ним относятся @reboot, @yearly, @annually, @monthly, @weekly, @daily, @midnight и @hourly. Например, @hourly эквивалентно 0 * * * *.
Давайте добавим задание, которое запускается ежечасно и записывает время безотказной работы системы в ~/uptime_log.txt.
Откройте свой crontab для редактирования:
crontab -e
В vim:
- Нажмите
i, чтобы войти в режим вставки - Добавьте следующую строку:
@hourly uptime >> ~/uptime_log.txt
- Нажмите
Esc, чтобы выйти из режима вставки - Введите
:wqи нажмитеEnter, чтобы сохранить и выйти
Проверьте все три записи:
crontab -l
Теперь вы должны увидеть все три задания cron.
Чтобы продемонстрировать эффект этих заданий, мы подождем короткий период времени. Поскольку задания запланированы через разные интервалы, мы не увидим, как все они выполнятся немедленно, но мы можем проверить настройку.
Подождите не менее 3 минут, чтобы задание */2 выполнилось хотя бы один раз.
Проверьте файл ~/cron_messages.txt:
cat ~/cron_messages.txt
Вы должны увидеть хотя бы одно сообщение "Hello from cron!".
Hello from cron!
Файлы ~/disk_usage.log и ~/uptime_log.txt могут еще не быть созданы, в зависимости от текущего времени, поскольку они запланированы на ежедневное и ежечасное выполнение соответственно. Важно то, что их записи правильно настроены в вашем crontab.
На этом завершается шаг управления пользовательским crontab. Все задания cron будут продолжать выполняться до уничтожения контейнера.
Планирование повторяющихся системных заданий с использованием каталогов cron
В этом шаге вы узнаете, как планировать повторяющиеся задачи на уровне системы с использованием каталогов cron. В отличие от записей crontab пользователя, которые относятся к конкретному пользователю, системные задания cron управляются пользователем root и влияют на всю систему. Они обычно используются для обслуживания системы, ротации журналов и других административных задач.
Мы продолжим работу в локальной системе, чтобы изучить конфигурацию системных заданий cron.
Системные задания cron определяются в /etc/crontab или путем размещения скриптов в определенных каталогах:
/etc/cron.hourly/: Скрипты в этом каталоге запускаются один раз в час./etc/cron.daily/: Скрипты в этом каталоге запускаются один раз в день./etc/cron.weekly/: Скрипты в этом каталоге запускаются один раз в неделю./etc/cron.monthly/: Скрипты в этом каталоге запускаются один раз в месяц.
Эти каталоги обрабатываются утилитой run-parts, которая выполняет все исполняемые файлы в них.
Для управления системными заданиями cron вам потребуются права root. Поскольку у пользователя labex есть доступ sudo, мы можем использовать sudo для необходимых команд.
Давайте создадим простой скрипт, который записывает сообщение в системный журнал. Мы поместим этот скрипт в /etc/cron.hourly/, чтобы он запускался ежечасно.
Сначала создайте файл скрипта /etc/cron.hourly/my_hourly_script:
sudo nano /etc/cron.hourly/my_hourly_script
Добавьте следующее содержимое в файл:
#!/bin/bash
logger "Hourly cron job executed at $(date)"
Сохраните и выйдите из редактора (Ctrl+o, Enter, Ctrl+x в nano).
Далее вам нужно сделать скрипт исполняемым. Без прав на выполнение run-parts проигнорирует его.
sudo chmod +x /etc/cron.hourly/my_hourly_script
Теперь давайте проверим, что скрипт исполняемый:
ls -l /etc/cron.hourly/my_hourly_script
Вы должны увидеть x в разрешениях, например: -rwxr-xr-x.
Поскольку задания cron.hourly выполняются один раз в час, мы не можем ждать целый час, чтобы проверить его выполнение в этой лаборатории. Однако мы можем вручную запустить команду run-parts для почасового каталога, чтобы смоделировать его выполнение.
sudo run-parts /etc/cron.hourly/
Эта команда выполнит все исполняемые скрипты в /etc/cron.hourly/. Скрипт, который мы создали, использует команду logger для записи сообщений в системный журнал. Хотя мы не можем легко проверить вывод журнала в этой среде контейнера, важной целью обучения является понимание того, как создавать скрипты и управлять ими в каталогах cron.
В реальной системе RHEL вы сможете проверить системные журналы с помощью journalctl или /var/log/messages, чтобы убедиться, что скрипт выполнен успешно.
На этом завершается шаг управления системными заданиями cron. Скрипт останется на месте и будет выполняться ежечасно в реальной системной среде.
Настройка systemd таймеров для повторяющихся задач
В этом шаге вы узнаете о таймерах systemd, которые являются современной альтернативой cron для планирования задач в системах Linux. Таймеры systemd предлагают большую гибкость и лучшую интеграцию с экосистемой systemd. Хотя команды systemctl обычно используются для управления юнитами systemd, из-за среды контейнера Docker мы сосредоточимся на создании и проверке файлов юнитов таймера и службы напрямую.
Таймеры systemd работают совместно с юнитами служб systemd. Юнит таймера (файл .timer) определяет, когда должна запускаться задача, а юнит службы (файл .service) определяет, какая задача должна быть выполнена.
Мы продолжим работу в локальной системе, чтобы изучить конфигурацию таймеров systemd.
Вам потребуются права root для создания файлов юнитов systemd в системных каталогах. Поскольку у пользователя labex есть доступ sudo, мы можем использовать sudo для необходимых команд.
Давайте создадим простую службу, которая записывает сообщение в файл. Мы поместим этот файл юнита службы в /etc/systemd/system/, где обычно хранятся пользовательские юниты служб.
Создайте файл юнита службы /etc/systemd/system/my-custom-task.service:
sudo nano /etc/systemd/system/my-custom-task.service
Добавьте следующее содержимое в файл:
[Unit]
Description=My Custom Scheduled Task
[Service]
Type=oneshot
ExecStart=/bin/bash -c 'echo "My custom task executed at $(date)" >> /var/log/my-custom-task.log'
Сохраните и выйдите из редактора (Ctrl+o, Enter, Ctrl+x в nano).
Далее создайте файл юнита таймера /etc/systemd/system/my-custom-task.timer. Этот таймер будет активировать нашу службу каждые 5 минут.
sudo nano /etc/systemd/system/my-custom-task.timer
Добавьте следующее содержимое в файл:
[Unit]
Description=Run My Custom Scheduled Task every 5 minutes
[Timer]
OnCalendar=*:0/5
Persistent=true
[Install]
WantedBy=timers.target
Сохраните и выйдите из редактора.
Объяснение OnCalendar:
*:0/5означает "каждые 5 минут".*для года, месяца, дня, часа (любое значение).0/5для минуты, что означает, начиная с минуты 0, каждые 5 минут (0, 5, 10, ..., 55).
В типичной среде systemd вы бы сейчас запустили systemctl daemon-reload, чтобы systemd узнал о новых файлах юнитов, а затем systemctl enable --now my-custom-task.timer, чтобы запустить таймер. Однако из-за ограничений контейнера Docker systemctl не полностью функционален.
Вместо этого мы вручную проверим создание файлов. Демон systemd внутри контейнера может в конечном итоге подхватить эти файлы, но мы не можем напрямую контролировать или наблюдать за выполнением его таймера в этой лабораторной настройке. Основная цель здесь - понять, как настроить эти файлы.
Давайте проверим существование созданных файлов:
ls -l /etc/systemd/system/my-custom-task.service
ls -l /etc/systemd/system/my-custom-task.timer
Вы должны увидеть вывод, указывающий на то, что оба файла существуют.
Чтобы смоделировать выполнение службы, вы можете вручную запустить команду, определенную в ExecStart:
sudo /bin/bash -c 'echo "My custom task executed at $(date)" >> /var/log/my-custom-task.log'
Теперь проверьте файл журнала, чтобы увидеть вывод:
sudo cat /var/log/my-custom-task.log
Вы должны увидеть сообщение, которое вы только что записали:
My custom task executed at Tue Jun 10 06:54:40 UTC 2025
На этом завершается шаг настройки таймера systemd. Файлы юнитов службы и таймера останутся на месте для справки.
Управление временными файлами с помощью systemd-tmpfiles
В этом шаге вы узнаете, как управлять временными файлами и каталогами с помощью systemd-tmpfiles. Эта утилита является частью systemd и отвечает за создание, удаление и очистку временных файлов и каталогов. Она обычно используется для управления /tmp, /var/tmp и другими временными хранилищами, обеспечивая периодическое удаление старых файлов.
Мы продолжим работу в локальной системе, чтобы изучить конфигурацию systemd-tmpfiles.
Вам потребуются права root для настройки systemd-tmpfiles. Поскольку у пользователя labex есть доступ sudo, мы можем использовать sudo для необходимых команд.
systemd-tmpfiles читает файлы конфигурации из /etc/tmpfiles.d/ и /usr/lib/tmpfiles.d/. Эти файлы определяют правила создания, удаления и управления файлами и каталогами.
Давайте создадим пользовательский файл конфигурации для управления новым временным каталогом. Мы создадим каталог /run/my_temp_dir и настроим systemd-tmpfiles для очистки файлов старше 1 минуты из него.
Создайте файл конфигурации /etc/tmpfiles.d/my_temp_dir.conf:
sudo nano /etc/tmpfiles.d/my_temp_dir.conf
Добавьте следующее содержимое в файл:
d /run/my_temp_dir 0755 labex labex 1m
Объяснение строки:
d: Указывает, что эта запись определяет каталог./run/my_temp_dir: Путь к каталогу.0755: Разрешения для каталога.labex labex: Владелец и группа для каталога.1m: Возраст, по истечении которого файлы в этом каталоге должны быть удалены (1 минута).
Сохраните и выйдите из редактора (Ctrl+o, Enter, Ctrl+x в nano).
Теперь давайте укажем systemd-tmpfiles применить эту конфигурацию. Опция --create создаст каталог, если он не существует.
sudo systemd-tmpfiles --create /etc/tmpfiles.d/my_temp_dir.conf
Убедитесь, что каталог был создан с правильными разрешениями и владельцем:
ls -ld /run/my_temp_dir
Вы должны увидеть вывод, аналогичный:
drwxr-xr-x 2 labex labex 6 Jun 10 06:55 /run/my_temp_dir
Далее давайте создадим тестовый файл внутри этого нового временного каталога:
sudo touch /run/my_temp_dir/test_file.txt
Убедитесь, что файл существует:
ls -l /run/my_temp_dir/test_file.txt
Теперь нам нужно подождать больше 1 минуты, чтобы файл стал «старым» в соответствии с нашей конфигурацией. Подождите не менее 70 секунд (1 минута и 10 секунд).
Подождав больше 1 минуты, мы вручную запустим systemd-tmpfiles с опцией --clean, чтобы запустить процесс очистки на основе нашей конфигурации.
sudo systemd-tmpfiles --clean /etc/tmpfiles.d/my_temp_dir.conf
Наконец, проверьте, был ли удален test_file.txt:
ls -l /run/my_temp_dir/test_file.txt
Вы должны получить ошибку "No such file or directory" (Нет такого файла или каталога), указывающую на то, что systemd-tmpfiles успешно очистил старый файл.
На этом завершается шаг конфигурации systemd-tmpfiles. Файл конфигурации и временный каталог останутся на месте для справки.
Резюме
В этой лабораторной работе вы узнали, как планировать и управлять одноразовыми задачами с помощью команды at, включая интерактивное и неинтерактивное планирование заданий, просмотр очереди at с помощью atq и удаление ожидающих заданий с помощью atrm. Вы также приобрели навыки планирования повторяющихся задач, специфичных для пользователей, с помощью crontab, охватывая способы редактирования, просмотра и удаления заданий cron, а также понимание синтаксиса cron для указания времени выполнения. Кроме того, в лабораторной работе было продемонстрировано, как планировать повторяющиеся задачи в масштабе всей системы, помещая скрипты в стандартные каталоги cron (/etc/cron.hourly, /etc/cron.daily и т. д.), и как создавать пользовательские задания cron в /etc/cron.d.
Наконец, вы изучили расширенное планирование задач с помощью таймеров systemd, научившись создавать и включать юниты служб и таймеров для повторяющихся задач, а также как управлять временными файлами и каталогами с помощью systemd-tmpfiles для автоматической очистки. Эта всеобъемлющая лабораторная работа предоставила практический опыт в управлении различными потребностями в планировании задач в системах RHEL, от простых одноразовых команд до сложных повторяющихся системных процессов.



