Управление сервисами в Systemd
Что такое Systemd?
Systemd — это система инициализации и менеджер сервисов, используемый по умолчанию во многих дистрибутивах Linux: Arch, Debian, Fedora, Red Hat, Ubuntu и других. В простом определении: systemd управляет «units» — объектами, которые представляют сервисы, монтирования, сокеты и устройства. Понятия:
- unit — объект systemd, обычно с расширением .service, .mount, .socket и т.д.
- сервис — .service unit, обычно демон или процесс, выполняющий задачу.
Systemd заменил старую систему init (SysV) и предоставляет расширенные возможности оркестрации запуска сервисов, зависимости и логирования.
Important: даже если вы не являетесь поклонником архитектурных решений systemd, знание его базовых команд важно — многие дистрибутивы полагаются на него.
Быстрый пример: утилита hddtemp
Для демонстрации мы используем hddtemp — небольшую утилиту для чтения температуры жесткого диска. Она доступна в репозиториях многих дистрибутивов и поставляется как systemd-сервис.
Установка:
# На Arch Linux
sudo pacman -S hddtemp
# На Debian/Ubuntu
sudo apt-get install hddtempЗапуск сервиса вручную:
sudo systemctl start hddtemp.serviceПримечание: при указании имени можно опустить суффикс .service, то есть sudo systemctl start hddtemp эквивалентен предыдущей команде.
Вы можете остановить или перезапустить сервис теми же командами:
sudo systemctl stop hddtemp
sudo systemctl restart hddtemp
По умолчанию команды start/stop/restart не выводят текст при успешном выполнении. Чтобы просмотреть состояние сервиса и последние логи:
sudo systemctl status hddtemp
sudo journalctl -u hddtemp --since "1 hour ago"Команда status покажет: имя сервиса, текущее состояние (active, inactive, failed), последние активизации и ошибки — если такие были.
Включение и отключение автозапуска
Команды start/stop — это ручный запуск для текущей сессии. Если вы хотите, чтобы сервис запускался автоматически при загрузке, используйте enable:
sudo systemctl enable hddtempЭта команда создаёт символьную ссылку в каталоге systemd, указывающую, что сервис должен запускаться при загрузке. Чтобы одновременно включить автозапуск и запустить сервис в текущей сессии, используйте флажок –now:
sudo systemctl enable --now hddtempОтключить автозапуск:
sudo systemctl disable hddtempПроверить, включён ли автозапуск:
sudo systemctl is-enabled hddtempЕсли вам нужно полностью предотвратить запуск сервиса (даже если другие юниты зависят от него), можно «замаскировать» сервис:
sudo systemctl mask hddtemp
sudo systemctl unmask hddtempMask создаёт ссылку на /dev/null и фактически делает запуск сервиса невозможным, пока он замаскирован.
Диагностика и типичные ошибки
Когда systemctl возвращает ошибку или сервис не запускается, последовательность действий для диагностики:
- Посмотреть статус сервиса:
sudo systemctl status hddtemp- Посмотреть логи unit через journalctl:
sudo journalctl -u hddtemp --no-pager- Проверить конфигурацию unit-файла:
systemctl cat hddtemp.service- Проверить зависимости и целевые цели:
systemctl list-dependencies hddtemp.service- Для временного запуска в режиме отладки запустите основной исполняемый файл вручную (если известно) и проверьте вывод ошибок.
Когда команда systemctl не выводит ошибок, но сервис всё равно не функционирует, смотрите логи приложения (не только systemd) и права доступа к файлам и сокетам.
Notes: часто причина — неправильная конфигурация unit-файла, отсутствующие зависимости или ошибочные пути в ExecStart.
Безопасность и ограничение прав сервисов
Systemd позволяет жёстко ограничивать окружение сервисов прямо в их unit-файлах. Несколько практических рекомендаций:
- Используйте User= и Group= для запуска не от root там, где это допустимо.
- Ограничивайте доступ к файловой системе с помощью ReadOnlyPaths= и InaccessiblePaths=.
- Включайте PrivateTmp= и NoNewPrivileges= для минимизации поверхности атаки.
- Для сетевых сервисов используйте systemd socket-активацию или ограничьте Capabilities=.
Эти меры снижают риски при запуске сторонних демонов.
Краткая шпаргалка команд (чек-лист)
- Запустить: sudo systemctl start
- Остановить: sudo systemctl stop
- Перезапустить: sudo systemctl restart
- Проверить состояние: sudo systemctl status
- Включить автозапуск: sudo systemctl enable
- Отключить автозапуск: sudo systemctl disable
- Включить и запустить сразу: sudo systemctl enable –now
- Проверить, включён ли: sudo systemctl is-enabled
- Замаскировать: sudo systemctl mask
- Посмотреть логи: sudo journalctl -u
Руководство по ролям — что нужно знать разным пользователям
Администратор сервера:
- Всегда проверяйте статус и логи перед перезапуском production-сервиса.
- Используйте enable/disable для управления автозапуском.
- Применяйте ограничения безопасности в unit-файлах.
Десктоп-пользователь:
- Для локальных демонов достаточно start/stop и is-enabled.
- Если приложение при установке создало сервис, disable удалит автозапуск.
Разработчик:
- Используйте systemctl –user для пользовательских юнитов, если нужно запускать сервисы в контексте пользователя.
- При разработке unit-файлов тестируйте с systemd-analyze verify.
Decision tree для действия с сервисом
flowchart TD
A[Сервис не работает] --> B{Есть ли ошибки в статусе?}
B -->|Да| C[Просмотреть journalctl -u unit]
B -->|Нет| D[Проверить конфигурацию unit: systemctl cat]
C --> E{Можно исправить быстро?}
E -->|Да| F[Внести правку и systemctl restart]
E -->|Нет| G[Откатить к предыдущей рабочей версии или mask]
D --> F
G --> H[Связаться с поддержкой/разработчиком]Критерии приёмки
- Команда systemctl status показывает active (running) для сервиса после запуска.
- journalctl не показывает критических ошибок за последние 5 минут после старта.
- При enable –now сервис запускается и остаётся включённым после перезагрузки.
- При disable сервис не запускается автоматически после перезагрузки.
Тестовые случаи и приёмка
- Установка hddtemp → systemctl start hddtemp → статус active.
- enable –now hddtemp → перезагрузка → через systemctl is-enabled hddtemp вывод “enabled” и сервис работает.
- mask hddtemp → попытка systemctl start hddtemp должна завершиться ошибкой.
1‑линейный глоссарий
- unit: базовый объект systemd (service, socket, mount и т.д.).
- service: unit, запускающий демон или процесс.
- mask: блокировка запуска unit через ссылку на /dev/null.
- enable: включение автозапуска при загрузке.
Советы по миграции и совместимости
- Большинство современных дистрибутивов поставляются с systemd по умолчанию; отличия между ними касаются путей к unit-файлам и менеджмента пакетов.
- Для пользовательских юнитов используйте каталог ~/.config/systemd/user.
- Если администрируемая система старая и использует SysV, возможно потребуется изучить совместимость скриптов init.
Итог
Команды systemctl для запуска, остановки, включения и отключения сервисов — основные инструменты управления программами в Linux-системах с systemd. Освоив их, вы сможете управлять демонами, настраивать автозапуск, проводить диагностику и повышать безопасность сервисов.
Summary: попрактикуйтесь на безопасных примерах (например, hddtemp), используйте журнал systemd для диагностики и применяйте встроенные меры ограничения прав для повышения безопасности систем.
Похожие материалы
HydraPaper — разный фон на каждом мониторе
Исправить ошибку 0x80070070 — недостаточно места
Добавить текстуру к тексту в Photoshop
Как очистить и продезинфицировать пульт от телевизора
Включить NumLock при запуске Windows 10