Введение
Системные администраторы Linux используют несколько способов планирования задач. Команда at позволяет планировать однократные задания, cron — повторяющиеся задачи на основе простых временных параметров, а таймеры systemd — запускать сервисы systemd с использованием встроенных механизмов зависимостей и логирования.
В этой лабораторной работе вы создадите скрипт и запланируете его выполнение тремя способами. Вы проверите работу планировщиков, поставите в очередь однократное задание at, настроите файл конфигурации cron, создадите пару из сервиса и таймера systemd, а также вручную протестируете работу сервиса, управляемого таймером.
Проверка планировщиков и создание скрипта задания
На этом этапе вы убедитесь, что службы планировщиков запущены, и создадите небольшой скрипт, который будет вызываться всеми запланированными заданиями.
Перейдите в директорию проекта.
cd /home/labex/project
Проверьте работу демона однократных заданий и демона cron. Команда systemctl is-active выводит active, если служба в данный момент запущена.
systemctl is-active atd crond
Выведите список существующих таймеров systemd. В выводе отобразится время следующего запуска, имя модуля таймера и имя сервиса, который он активирует.
systemctl list-timers --all --no-pager | sed -n '1,10p'
Создайте скрипт, который добавляет строку с отметкой времени в лог-файл. Первый аргумент $1 будет служить меткой, указывающей, какой планировщик выполнил скрипт.
cat > /home/labex/project/scheduled-note.sh <<'EOF'
#!/bin/bash
echo "$(date '+%F %T') $1" >> /home/labex/project/schedule-events.log
EOF
Сделайте скрипт исполняемым.
chmod 755 /home/labex/project/scheduled-note.sh
Запустите скрипт вручную один раз.
/home/labex/project/scheduled-note.sh manual-run
tail -n 1 /home/labex/project/schedule-events.log
Строка в логе должна заканчиваться на manual-run.
Постановка в очередь однократного задания at
На этом этапе вы запланируете однократное задание с помощью at. Это полезно для задач, которые должны выполниться один раз в будущем, например, для временных задач по обслуживанию.
Запланируйте выполнение скрипта через два часа. Команда передается в at через конвейер.
echo "/home/labex/project/scheduled-note.sh at-job" | at now + 2 hours
Выведите список заданий в очереди.
atq
Сохраните ID задания из первой строки вывода atq. ID задания — это первое поле в выводе.
job_id="$(atq | awk 'NR==1 {print $1}')"
echo "$job_id" > /home/labex/project/at-job.id
cat /home/labex/project/at-job.id
Проверьте содержимое задания в очереди. Команда at -c выводит сгенерированный скрипт задания; последние строки должны содержать команду, которую вы запланировали.
at -c "$job_id" | tail -n 12
Настройка файла конфигурации cron
На этом этапе вы настроите повторяющееся задание cron с помощью файла в директории /etc/cron.d. Файлы в этой директории содержат поле пользователя, поэтому система знает, от чьего имени должна выполняться команда.
Создайте файл cron, который запускает скрипт каждую минуту от имени пользователя labex. Строка PATH задает для cron предсказуемый путь поиска команд.
sudo tee /etc/cron.d/rhcsa-schedule-demo >/dev/null <<'EOF'
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
* * * * * labex /home/labex/project/scheduled-note.sh cron-job
EOF
Установите права доступа 644. Файлы cron должны быть доступны для чтения, но не должны быть доступны для записи обычным пользователям.
sudo chmod 644 /etc/cron.d/rhcsa-schedule-demo
Перезагрузите crond, чтобы он немедленно распознал файл.
sudo systemctl reload crond
Проверьте созданный файл.
sudo cat /etc/cron.d/rhcsa-schedule-demo
Поля расписания * * * * * означают выполнение каждую минуту.
Создание сервиса и таймера systemd
На этом этапе вы создадите сервис systemd и таймер, который его активирует. Таймер не запускает команду напрямую; он запускает модуль сервиса.
Системные службы должны выполнять команды из системных путей, а не из рабочей директории пользователя. Установите копию вашего скрипта в /usr/local/bin.
sudo install -m 755 /home/labex/project/scheduled-note.sh /usr/local/bin/rhcsa-scheduled-note
sudo restorecon /usr/local/bin/rhcsa-scheduled-note 2>/dev/null || true
ls -l /usr/local/bin/rhcsa-scheduled-note
Создайте модуль сервиса. Type=oneshot подходит для команды, которая выполняется и завершается.
sudo tee /etc/systemd/system/rhcsa-schedule-demo.service >/dev/null <<'EOF'
[Unit]
Description=Write RHCSA schedule demo entry
[Service]
Type=oneshot
User=labex
ExecStart=/usr/local/bin/rhcsa-scheduled-note timer-job
EOF
Создайте модуль таймера. OnBootSec=2min планирует первый запуск после загрузки, а OnUnitActiveSec=5min планирует последующие запуски относительно предыдущей активации.
sudo tee /etc/systemd/system/rhcsa-schedule-demo.timer >/dev/null <<'EOF'
[Unit]
Description=Run RHCSA schedule demo periodically
[Timer]
OnBootSec=2min
OnUnitActiveSec=5min
Unit=rhcsa-schedule-demo.service
[Install]
WantedBy=timers.target
EOF
Перезагрузите конфигурацию systemd, включите таймер для автозагрузки и запустите его. Разделение команд enable и start позволяет четко понять, какая команда делает таймер постоянным, а какая активирует его немедленно.
sudo systemctl daemon-reload
sudo systemctl enable rhcsa-schedule-demo.timer
sudo systemctl start rhcsa-schedule-demo.timer
Проверьте таймер.
systemctl list-timers rhcsa-schedule-demo.timer --all --no-pager
Таймер должен появиться в списке и активировать rhcsa-schedule-demo.service.
Тестирование сервиса таймера и удаление задания at
На этом этапе вы вручную запустите сервис, используемый таймером. Это позволит проверить команду немедленно, не дожидаясь следующей запланированной активации. Вы также удалите задание at, так как оно было создано только для практики.
Запустите сервис вручную.
sudo systemctl start rhcsa-schedule-demo.service
Проверьте лог.
tail -n 5 /home/labex/project/schedule-events.log
Одна из строк должна заканчиваться на timer-job.
Удалите запланированное задание at, используя ID, сохраненный ранее.
job_id="$(cat /home/labex/project/at-job.id)"
atrm "$job_id"
Убедитесь, что задание больше не находится в очереди.
atq
Резюме
Вы попрактиковались в трех методах планирования задач. Вы изучили работу atd, crond и таймеров systemd, создали многоразовый скрипт, поставили в очередь и проверили однократное задание at, настроили файл конфигурации cron, установили безопасную команду в /usr/local/bin, создали пару из сервиса и таймера systemd, вручную протестировали сервис таймера и удалили временное задание at.



