Введение
В этой лабораторной работе вы получите практический опыт управления системными службами в RHEL с помощью команды systemctl. Вы научитесь просматривать все загруженные и активные службы, проверять их состояние, а также управлять их работой: запускать, останавливать и перезапускать. Кроме того, вы узнаете, как перезагружать конфигурации служб, включать или отключать их автозапуск при загрузке системы, а также разберетесь в продвинутых концепциях маскировки и разблокировки служб для предотвращения их активации.
Это практическое руководство даст вам необходимые навыки системного администрирования, позволяющие эффективно отслеживать и управлять жизненным циклом служб, критически важных для работы вашей системы RHEL.
Просмотр всех загруженных и активных служб с помощью systemctl
На этом этапе вы научитесь определять автоматически запущенные системные процессы с помощью команды systemctl. systemctl — это основной инструмент для управления службами systemd в Red Hat Enterprise Linux.
Сначала давайте узнаем, как вывести список всех загруженных и активных модулей служб (service units). Для этого используется команда systemctl list-units --type=service. Она отображает те службы, которые демон systemd успешно проанализировал, загрузил в память и которые в данный момент активны.
Откройте терминал в среде RHEL. Вы уже вошли в систему как пользователь labex, а ваша текущая директория — ~/project.
Выполните следующую команду, чтобы вывести список всех загруженных и активных служб:
systemctl list-units --type=service
Вы увидите вывод, похожий на этот, где отображаются различные службы и их состояния:
UNIT LOAD ACTIVE SUB DESCRIPTION
atd.service loaded active running Job spooling tools
auditd.service loaded active running Security Auditing Service
chronyd.service loaded active running NTP client/server
crond.service loaded active running Command Scheduler
dbus-broker.service loaded active running D-Bus System Message Bus
...output omitted...
Разберем столбцы вывода:
- UNIT: Имя модуля службы, обычно заканчивающееся на
.service. - LOAD: Указывает, успешно ли демон
systemdпроанализировал конфигурацию модуля и загрузил её в память.loadedозначает успех. - ACTIVE: Высокоуровневое состояние активации модуля.
activeобычно означает, что служба успешно запущена. - SUB: Низкоуровневое состояние активации, предоставляющее более детальную информацию. Для работающих служб часто встречается
running. - DESCRIPTION: Краткое описание того, что делает служба.
Нажмите q, чтобы выйти из команды.
Далее вы можете использовать опцию --all вместе с systemctl list-units --type=service, чтобы вывести список всех служб независимо от их состояния (активные, неактивные, с ошибками и т.д.). Это полезно для просмотра служб, которые установлены, но в данный момент не запущены.
Выполните следующую команду:
systemctl list-units --type=service --all
Вывод будет включать службы, которые находятся в состоянии inactive или других, что обеспечит более полный обзор:
UNIT LOAD ACTIVE SUB DESCRIPTION
atd.service loaded active running Job spooling tools
auditd.service loaded active running Security Auditing ...
auth-rpcgss-module.service loaded inactive dead Kernel Module ...
chronyd.service loaded active running NTP client/server
cpupower.service loaded inactive dead Configure CPU power ...
crond.service loaded active running Command Scheduler
dbus-broker.service loaded active running D-Bus System Message Bus
● display-manager.service not-found inactive dead display-manager.service
...output omitted...
Наконец, чтобы увидеть состояние всех установленных файлов модулей, включая те, что не загружены или не активны, можно использовать systemctl list-unit-files --type=service. Эта команда показывает, является ли служба enabled (запускается при загрузке), disabled (не запускается при загрузке), static (не может быть включена напрямую, но может быть запущена другим модулем) или masked (запуск предотвращен).
Выполните следующую команду:
systemctl list-unit-files --type=service
Вы увидите вывод, похожий на этот, с указанием STATE (состояния) и VENDOR PRESET (предустановки поставщика) для каждого файла службы:
UNIT FILE STATE VENDOR PRESET
arp-ethers.service disabled disabled
atd.service enabled enabled
auditd.service enabled enabled
auth-rpcgss-module.service static -
autovt@.service alias -
blk-availability.service disabled disabled
...output omitted...
Эта команда особенно полезна для понимания того, какие службы настроены на автоматический запуск при загрузке системы.
Проверка состояния конкретной службы с помощью systemctl status
На этом этапе вы научитесь проверять подробное состояние конкретной службы с помощью команды systemctl status. Эта команда предоставляет исчерпывающую информацию о службе, включая то, запущена ли она, её идентификатор процесса (PID), использование памяти и последние записи в журнале.
В качестве примера мы будем использовать crond.service (демон cron). Демон cron — это распространенная служба, которая обрабатывает запланированные задачи.
Откройте терминал в среде RHEL. Убедитесь, что вы находитесь в директории ~/project.
Выполните следующую команду, чтобы проверить состояние crond.service:
systemctl status crond.service
Вы увидите подробный вывод, похожий на этот:
● crond.service - Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; preset: enabled)
Active: active (running) since Mon 2022-03-14 05:38:10 EDT; 25min ago
Main PID: 1089 (crond)
Tasks: 1 (limit: 35578)
Memory: 1.2M
CPU: 12ms
CGroup: /system.slice/crond.service
└─1089 /usr/sbin/crond -n
Mar 14 05:38:10 workstation systemd[1]: Started Command Scheduler.
Warning: some journal files were not opened due to insufficient permissions.
Давайте разберем ключевые поля вывода:
Loaded: Эта строка сообщает, был ли обработан файл конфигурации службы. Также здесь указан путь к файлу модуля (/usr/lib/systemd/system/crond.service) и статус включения (enabledозначает, что служба настроена на запуск при загрузке).Active: Это критически важное поле. Оно указывает текущее состояние службы.active (running)означает, что служба активна и её процессы запущены. Также здесь указано, как долго она активна. Другие состояния могут бытьinactive(не запущена),active (exited)(завершила однократную задачу) илиfailed(произошла ошибка).Main PID: Идентификатор процесса (PID) основного процесса, связанного со службой, вместе с именем команды.Tasks: Количество задач (потоков), которые служба использует в данный момент.Memory: Объем памяти, потребляемый службой.CPU: Время процессора, затраченное службой.CGroup: Информация о контрольной группе, к которой принадлежит служба, используемая для управления ресурсами.- Строки под
CGroupпоказывают последние записи журнала, относящиеся к службе, что дает представление о её запуске и текущей активности.
Помимо systemctl status, существуют более простые команды для быстрой проверки конкретных аспектов состояния службы:
Чтобы проверить, активна ли служба:
systemctl is-active crond.serviceОжидаемый вывод:
activeЧтобы проверить, включена ли служба (настроена ли на запуск при загрузке):
systemctl is-enabled crond.serviceОжидаемый вывод:
enabledЧтобы проверить, завершилась ли служба с ошибкой:
systemctl is-failed crond.serviceОжидаемый вывод (если работает правильно):
activeЕсли у службы возникли проблемы при запуске или работе, эта команда вернет
failed.
Эти команды полезны для написания скриптов или быстрой проверки, когда вам не нужен полный подробный вывод systemctl status.
Запуск, остановка и перезапуск службы с помощью systemctl
На этом этапе вы научитесь управлять жизненным циклом системных служб с помощью команд systemctl. Вы потренируетесь запускать, останавливать и перезапускать службу. Для этого упражнения мы создадим фиктивную службу. Такой подход гарантирует, что мы сможем безопасно манипулировать службой, не затрагивая критически важные функции системы.
Сначала создадим простой файл модуля службы. Этот файл будет определять службу, которая просто записывает временную метку в лог-файл каждые несколько секунд.
Создайте новый файл модуля службы с именем mytest.service прямо в системной директории systemd с помощью nano:
sudo nano /etc/systemd/system/mytest.service
Вставьте следующее содержимое в редактор nano:
[Unit]
Description=My Test Service
After=network.target
[Service]
Type=simple
ExecStart=/bin/bash -c 'while true; do echo "$(date): My Test Service is running." >> /tmp/mytest.log; sleep 5; done'
ExecStop=/bin/bash -c 'echo "$(date): My Test Service stopped." >> /tmp/mytest.log'
Restart=on-failure
[Install]
WantedBy=multi-user.target
[Unit]: Содержит общую информацию о модуле.Descriptionпредоставляет понятное человеку имя, аAfter=network.targetуказывает, что эта служба должна запускаться после того, как сеть будет готова.[Service]: Определяет поведение службы.Type=simple: Указывает на простой тип службы, где командаExecStartявляется основным процессом.ExecStart: Команда, выполняемая при запуске службы. Здесь это цикл bash, который записывает сообщение с временной меткой в/tmp/mytest.logкаждые 5 секунд.ExecStop: Команда, выполняемая при остановке службы. Она записывает сообщение об остановке в лог.Restart=on-failure: Настраивает службу на перезапуск, если она завершается с ненулевым кодом выхода.
[Install]: Содержит информацию о том, как служба должна быть установлена.WantedBy=multi-user.targetозначает, что эта служба должна быть запущена, когда система достигает многопользовательского уровня запуска (runlevel).
Сохраните файл, нажав Ctrl+X, затем Y для подтверждения и Enter.
Теперь перезагрузите демон systemd, чтобы он распознал новый файл службы:
sudo systemctl daemon-reload
Запуск службы
Для запуска службы используйте команду systemctl start.
Выполните следующую команду, чтобы запустить mytest.service. Обратите внимание, что нам нужно использовать sudo, так как операции systemctl обычно требуют прав суперпользователя.
sudo systemctl start mytest.service
Если команда выполнена успешно, немедленного вывода не будет.
Теперь убедитесь, что служба запущена, проверив её состояние:
systemctl status mytest.service
Вы должны увидеть вывод, указывающий, что служба находится в состоянии active (running):
● mytest.service - My Test Service
Loaded: loaded (/etc/systemd/system/mytest.service; disabled; preset: disabled)
Active: active (running) since ...
Main PID: ... (bash)
Tasks: 2 (limit: ...)
Memory: ...
CPU: ...
CGroup: /system.slice/mytest.service
├─... /bin/bash -c "while true; do echo \"\$(date): My Test Service is running.\" >> /tmp/mytest.log; sleep 5; done"
└─... sleep 5
...output omitted...
Вы также можете проверить лог-файл, чтобы увидеть, записывает ли служба сообщения:
tail -f /tmp/mytest.log
Вы должны видеть новые строки, появляющиеся каждые 5 секунд, примерно так:
Tue Jul 22 09:15:09 AM CST 2025: My Test Service is running.
Tue Jul 22 09:15:14 AM CST 2025: My Test Service is running.
Нажмите Ctrl+C, чтобы выйти из tail.
Остановка службы
Для остановки работающей службы используйте команду systemctl stop.
Выполните следующую команду, чтобы остановить mytest.service:
sudo systemctl stop mytest.service
Опять же, немедленного вывода не будет.
Убедитесь, что служба остановлена:
systemctl status mytest.service
Теперь вывод должен показывать Active: inactive (dead):
○ mytest.service - My Test Service
Loaded: loaded (/etc/systemd/system/mytest.service; disabled; preset: disabled)
Active: inactive (dead) since ...
...output omitted...
Снова проверьте лог-файл /tmp/mytest.log. Вы должны увидеть сообщение "My Test Service stopped." и отсутствие новых сообщений "running".
tail /tmp/mytest.log
Вывод будет выглядеть примерно так:
Tue Jul 22 09:15:24 AM CST 2025: My Test Service is running.
Tue Jul 22 09:15:28 AM CST 2025: My Test Service stopped.
Перезапуск службы
Для перезапуска службы используйте команду systemctl restart. Эта команда сначала останавливает службу, а затем запускает её снова. Это полезно, когда вы внесли изменения в конфигурацию службы и хотите, чтобы они вступили в силу.
Выполните следующую команду, чтобы перезапустить mytest.service:
sudo systemctl restart mytest.service
Убедитесь, что служба снова запущена:
systemctl status mytest.service
Вы снова должны увидеть Active: active (running), и Main PID, скорее всего, будет новым числом, что указывает на запуск нового процесса.
● mytest.service - My Test Service
Loaded: loaded (/etc/systemd/system/mytest.service; disabled; preset: disabled)
Active: active (running) since ...
Main PID: ... (bash)
Tasks: 2 (limit: ...)
Memory: ...
CPU: ...
CGroup: /system.slice/mytest.service
├─... /bin/bash -c "while true; do echo \"\$(date): My Test Service is running.\" >> /tmp/mytest.log; sleep 5; done"
└─... sleep 5
...output omitted...
Проверьте лог-файл /tmp/mytest.log, чтобы убедиться, что служба возобновила запись сообщений "running".
tail -f /tmp/mytest.log
Вы должны увидеть сообщение "stopped", за которым следуют новые сообщения "running":
Tue Jul 22 09:15:28 AM CST 2025: My Test Service stopped.
Tue Jul 22 09:15:40 AM CST 2025: My Test Service is running.
Нажмите Ctrl+C, чтобы выйти из tail.
Применение изменений конфигурации к службе
На этом этапе вы узнаете о перезагрузке конфигураций служб. Некоторые службы могут применять изменения в своих конфигурационных файлах без необходимости полной перезагрузки. Это называется "перезагрузкой" (reloading) службы. Перезагрузка обычно предпочтительнее перезапуска, так как она позволяет избежать простоя службы и сохраняет существующие соединения или состояния. Когда служба перезагружается, её идентификатор процесса (PID) обычно остается прежним, в отличие от полного перезапуска, при котором PID меняется.
Мы продолжим использовать нашу службу mytest.service из предыдущего этапа. Мы изменим её поведение, а затем попытаемся перезагрузить её, чтобы увидеть, что произойдет.
Сначала убедитесь, что mytest.service запущена. Если нет, запустите её:
sudo systemctl start mytest.service
Проверьте её состояние и запишите Main PID:
systemctl status mytest.service
Теперь давайте изменим файл mytest.service, чтобы изменить сообщение, которое она записывает, и интервал. Мы изменим сообщение в логе и длительность sleep.
Откройте /etc/systemd/system/mytest.service с помощью nano:
sudo nano /etc/systemd/system/mytest.service
Измените строку ExecStart на следующую, изменив сообщение и время sleep с 5 на 2 секунды:
[Unit]
Description=My Test Service
After=network.target
[Service]
Type=simple
ExecStart=/bin/bash -c 'while true; do echo "$(date): My Test Service (reloaded) is running." >> /tmp/mytest.log; sleep 2; done'
ExecStop=/bin/bash -c 'echo "$(date): My Test Service stopped." >> /tmp/mytest.log'
Restart=on-failure
[Install]
WantedBy=multi-user.target
Сохраните файл, нажав Ctrl+X, затем Y и Enter.
После сохранения изменений вам нужно сообщить systemd, что конфигурация службы изменилась.
sudo systemctl daemon-reload
Теперь давайте попробуем перезагрузить службу, чтобы применить изменения:
sudo systemctl reload mytest.service
Скорее всего, вы столкнетесь с ошибкой:
Failed to reload mytest.service: Job type reload is not applicable for unit mytest.service.
Эта ошибка возникает потому, что наша простая служба не настроена на обработку запроса на перезагрузку. Чтобы служба могла быть перезагружена, её файл модуля должен содержать директиву ExecReload, которая указывает команду для перезагрузки конфигурации. Поскольку в нашей mytest.service этого нет, systemd не знает, как её перезагрузить.
В таких ситуациях systemd предоставляет удобную команду: reload-or-restart. Эта команда попытается перезагрузить службу, но если перезагрузка не поддерживается, она переключится на перезапуск службы. Это часто более безопасный и эффективный способ применения изменений конфигурации.
Давайте воспользуемся reload-or-restart сейчас:
sudo systemctl reload-or-restart mytest.service
Эта команда должна выполниться успешно. Теперь снова проверьте состояние службы:
systemctl status mytest.service
Обратите внимание на Main PID. Поскольку наша служба была перезапущена (потому что её нельзя было перезагрузить), вы заметите, что Main PID — это новое число. Это подтверждает, что старый процесс был остановлен, а новый запущен с обновленной конфигурацией.
Наконец, давайте проверим файл /tmp/mytest.log, чтобы увидеть, вступили ли изменения в силу.
tail -f /tmp/mytest.log
Вы должны видеть новое сообщение в логе "My Test Service (reloaded) is running.", появляющееся каждые 2 секунды. Нажмите Ctrl+C, чтобы выйти из tail.
Включение и отключение служб при загрузке с помощью systemctl
На этом этапе вы узнаете, как настроить службы на автоматический запуск при загрузке системы (включение) или предотвратить их запуск при загрузке (отключение). Это критически важно для управления системными ресурсами и обеспечения доступности необходимых служб при старте системы.
В типичной среде systemd включение службы создает символические ссылки в соответствующих конфигурационных директориях systemd (например, /etc/systemd/system/multi-user.target.wants/), которые указывают на файл модуля службы. Отключение службы удаляет эти ссылки.
Поскольку мы находимся в контейнеризированной среде, где systemd может не функционировать в полной мере в традиционном смысле, команды enable и disable могут не создавать реальные символические ссылки в директории /etc/systemd/system, которые сохраняются после перезапуска контейнера. Однако systemctl всё равно обрабатывает эти команды и обновляет своё внутреннее состояние, что мы и будем наблюдать.
Мы продолжим использовать нашу mytest.service для этой демонстрации.
Сначала убедитесь, что mytest.service остановлена после предыдущего этапа:
sudo systemctl stop mytest.service
Включение службы
Для включения службы используйте команду systemctl enable. Эта команда настраивает службу на автоматический запуск при загрузке системы.
Выполните следующую команду, чтобы включить mytest.service:
sudo systemctl enable mytest.service
Вы можете увидеть вывод, похожий на этот, указывающий, что символическая ссылка была бы создана в полноценной среде systemd:
Created symlink /etc/systemd/system/multi-user.target.wants/mytest.service → /etc/systemd/system/mytest.service.
Теперь убедитесь, что служба включена, используя systemctl is-enabled:
systemctl is-enabled mytest.service
Ожидаемый вывод:
enabled
Это подтверждает, что systemctl теперь считает mytest.service включенной для загрузки.
Вы также можете объединить включение и запуск службы в одной команде, используя опцию --now. Это удобный способ гарантировать, что служба и запущена немедленно, и настроена на запуск при будущих загрузках.
Сначала давайте отключим её, чтобы подготовиться к демонстрации --now:
sudo systemctl disable mytest.service
Теперь включите и запустите её одновременно:
sudo systemctl enable --now mytest.service
Проверьте её состояние и статус включения:
systemctl status mytest.service
systemctl is-enabled mytest.service
Вы должны увидеть Active: active (running) в команде status и enabled в команде is-enabled.
Отключение службы
Для отключения службы используйте команду systemctl disable. Эта команда удаляет конфигурацию, которая заставляет службу запускаться при загрузке.
Выполните следующую команду, чтобы отключить mytest.service:
sudo systemctl disable mytest.service
Вы можете увидеть вывод, указывающий на удаление символической ссылки:
Removed /etc/systemd/system/multi-user.target.wants/mytest.service.
Теперь убедитесь, что служба отключена:
systemctl is-enabled mytest.service
Ожидаемый вывод:
disabled
По аналогии с включением, вы можете объединить отключение и остановку службы, используя опцию --now. Это немедленно остановит службу и предотвратит её запуск при будущих загрузках.
sudo systemctl disable --now mytest.service
Проверьте её состояние и статус включения:
systemctl status mytest.service
systemctl is-enabled mytest.service
Вы должны увидеть Active: inactive (dead) в команде status и disabled в команде is-enabled.
На этом демонстрация включения и отключения служб завершена. Помните, что в реальной среде systemd эти команды напрямую манипулируют конфигурацией загрузки.
Маскировка и разблокировка служб с помощью systemctl
На этом последнем этапе вы узнаете о маскировке (masking) и разблокировке (unmasking) служб. Маскировка службы — это мощный способ предотвратить её запуск, как вручную, так и автоматически при загрузке.
Когда вы маскируете службу, systemd создает символическую ссылку из /etc/systemd/system/<имя-службы>.service в /dev/null, фактически делая файл модуля службы недоступным для systemd. Это более сильная альтернатива disable.
Этот механизм лучше всего работает для служб, определенных в /usr/lib/systemd/system, где пакеты устанавливают свои файлы служб. Команда mask создает переопределяющий "пустой" файл в /etc/systemd/system. Однако, как вы уже обнаружили, если вы попытаетесь замаскировать службу, которую создали напрямую в /etc/systemd/system (как нашу mytest.service), команда может завершиться ошибкой, так как она спроектирована так, чтобы не перезаписывать существующий файл конфигурации, что привело бы к потере данных.
Чтобы правильно продемонстрировать маскировку, мы будем использовать уже существующую службу atd.service.
Сначала давайте проверим текущее состояние atd.service. Она должна быть активна и включена.
systemctl status atd.service
Вывод будет похож на этот, показывая, что служба активна и работает:
● atd.service - Deferred execution scheduler
Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; preset: enabled)
Active: active (running) since Tue 2025-07-22 09:13:06 CST; 22min ago
Docs: man:atd(8)
Main PID: 1222 (atd)
Tasks: 1 (limit: 22509)
Memory: 900.0K
CPU: 5ms
CGroup: /system.slice/atd.service
└─1222 /usr/sbin/atd -f
Маскировка службы
Хорошей практикой является остановка службы перед её маскировкой.
sudo systemctl stop atd.service
Теперь выполните следующую команду, чтобы замаскировать atd.service:
sudo systemctl mask atd.service
Вы увидите вывод, указывающий на создание символической ссылки на /dev/null:
Created symlink /etc/systemd/system/atd.service → /dev/null.
Теперь попробуйте запустить замаскированную службу:
sudo systemctl start atd.service
Вы получите сообщение об ошибке, указывающее, что служба замаскирована:
Failed to start atd.service: Unit atd.service is masked.
Вы также можете проверить состояние службы с помощью systemctl list-unit-files:
systemctl list-unit-files --type=service | grep atd.service | tee ~/project/atd-mask-state.txt
Вывод должен показывать masked для atd.service:
atd.service masked enabled
Это подтверждает, что служба теперь замаскирована и не может быть запущена.
Разблокировка службы
Для разблокировки службы используйте команду systemctl unmask. Эта команда удаляет символическую ссылку на /dev/null, восстанавливая исходный файл службы из /usr/lib/systemd/system.
Выполните следующую команду, чтобы разблокировать atd.service:
sudo systemctl unmask atd.service
Вы увидите вывод, указывающий на удаление символической ссылки:
Removed "/etc/systemd/system/atd.service".
После разблокировки снова запустите службу, так как unmask только удаляет ссылку на /dev/null и не перезапускает службу за вас.
sudo systemctl start atd.service
Теперь проверьте состояние службы:
systemctl status atd.service
Вы должны увидеть Active: active (running), примерно так:
● atd.service - Deferred execution scheduler
Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; preset: enabled)
Active: active (running) since Tue 2025-07-22 09:36:10 CST; 2s ago
Docs: man:atd(8)
Main PID: 7372 (atd)
Tasks: 1 (limit: 22509)
Memory: 868.0K
CPU: 6ms
CGroup: /system.slice/atd.service
└─7372 /usr/sbin/atd -f
На этом лабораторная работа по управлению службами и демонами завершена. Вы научились просматривать, запускать, останавливать, перезапускать, перезагружать, включать, отключать, маскировать и разблокировать службы с помощью systemctl.
Резюме
В этой лабораторной работе мы получили практический опыт управления системными службами с помощью команды systemctl, даже в контейнеризированной среде, где systemd может не быть основной системой инициализации. Мы научились выводить список всех загруженных и активных модулей служб с помощью systemctl list-units --type=service, разбираясь в столбцах UNIT, LOAD, ACTIVE и SUB для интерпретации состояний служб.
Кроме того, мы изучили основные операции управления службами: проверку состояния конкретной службы с помощью systemctl status и управление жизненным циклом службы путем её запуска, остановки и перезапуска. Мы также рассмотрели, как перезагружать конфигурации служб, включать и отключать службы для управления их поведением при загрузке, а также продвинутые концепции маскировки и разблокировки служб для предотвращения их запуска. Этот комплексный набор навыков обеспечивает прочную основу для управления службами в системах RHEL.



