LinuxНизкая

Управление сервисами в Linux: полное руководство по systemd

В этом гайде вы освоите основные команды systemd для управления сервисами в Linux, включая запуск, остановку, проверку статуса и настройку автозапуска.

Обновлено 16 февраля 2026 г.
15-30 мин
Средняя
FixPedia Team
Применимо к:Ubuntu 22.04+Debian 11+CentOS 7/8Fedora 35+

Введение / Зачем это нужно

Systemd стал стандартом для инициализации и управления службами в большинстве современных дистрибутивов Linux (Ubuntu, Debian, CentOS, Fedora). Понимание управления сервисами — ключевой навык для системного администратора и разработчика, работающего с серверами. После прохождения этого гайда вы сможете уверенно запускать, останавливать, настраивать автозапуск и диагностировать проблемы с любыми сервисами, а также создавать собственные.

Требования / Подготовка

  1. Доступ к терминалу с правами sudo (или root).
  2. Дистрибутив Linux, использующий systemd (проверьте командой systemctl --version).
  3. Базовое понимание командной строки.

Шаг 1: Проверка наличия systemd и список юнитов

Убедимся, что система использует systemd, и посмотрим, какие сервисы (юниты) доступны.

# Проверка версии systemd
systemctl --version

# Показать все загруженные юниты (сервисы, таймеры, сокеты и т.д.)
systemctl list-units --type=service --state=running

# Показать ВСЕ доступные юниты, включая неактивные
systemctl list-unit-files --type=service | head -20

Ключевые статусы юнитов: loaded (файл юнита найден), active (запущен), inactive (остановлен), failed (упал с ошибкой).

Шаг 2: Базовые операции управления состоянием

Здесь основные команды для повседневного контроля.

# Запустить сервис немедленно (не навсегда)
sudo systemctl start nginx

# Остановить сервис
sudo systemctl stop nginx

# Перезапустить (остановить и снова запустить)
sudo systemctl restart nginx

# Перезагрузить (отправить SIGHUP, если сервис поддерживает)
sudo systemctl reload nginx

# Проверить статус (самая информативная команда)
sudo systemctl status nginx

В выводе status смотрите на строку Active: и последние логи в разделе journal. Если статус failed (Result: exit-code), смотрите логи в следующем шаге.

💡 Совет: Для быстрого перезапуска с очисткой состояния используйте sudo systemctl try-restart nginx — он не запустит сервис, если тот уже остановлен.

Шаг 3: Настройка автозапуска (включение/отключение)

Автозапуск управляется через символические ссылки в каталогах /etc/systemd/system/.

# Включить автозапуск при следующей загрузке системы
sudo systemctl enable nginx
# Создаст ссылку: /etc/systemd/system/multi-user.target.wants/nginx.service -> /lib/systemd/system/nginx.service

# Отключить автозапуск (ссылку удалит, сам файл сервиса останется)
sudo systemctl disable nginx

# Проверить, включён ли сервис в автозагрузку
systemctl is-enabled nginx
# Вывод: enabled, disabled, static, masked

⚠️ Важно: Команда enable не запускает сервис сразу. Для одноразового запуска используйте start, для запуска с включением автозапуска — enable --now.

Шаг 4: Диагностика через journalctl

Логи systemd хранятся в бинарном журнале, доступном через journalctl.

# Показать логи ВСЕХ сервисов в реальном времени (как tail -f)
sudo journalctl -f

# Показать логи КОНКРЕТНОГО сервиса
sudo journalctl -u nginx.service

# Показать логи с момента последней загрузки системы (-b)
sudo journalctl -u nginx.service -b

# Фильтрация по времени (например, за последние 10 минут)
sudo journalctl -u nginx.service --since "10 min ago"

# Показать только сообщения с уровнем ошибка (error, crit, alert, emerg)
sudo journalctl -u nginx.service -p err

# Очистить журнал (осторожно! требует место на диске)
sudo journalctl --vacuum-time=3d  # Оставить логи только за последние 3 дня

Для поиска по тексту в логах используйте стандартный grep:

sudo journalctl -u nginx.service | grep -i "permission"

Шаг 5: Создание простого пользовательского сервиса

Допустим, нужно запускать скрипт /opt/myscript.sh при старте системы.

  1. Создайте файл сервиса /etc/systemd/system/myscript.service:
    [Unit]
    Description=Мой пользовательский скрипт
    After=network.target
    
    [Service]
    Type=simple
    ExecStart=/opt/myscript.sh
    Restart=on-failure
    RestartSec=10
    User=ubuntu
    Group=ubuntu
    
    [Install]
    WantedBy=multi-user.target
    
    • After — запускать после сетевого стека.
    • Type=simple — процесс запускается и работает в foreground.
    • Restart=on-failure — перезапускать при падении.
    • User/Group — от какого пользователя запускать.
    • WantedBy — к какому целевому юниту (.target) принадлежит.
  2. Сохраните файл и выполните:
    # Перечитать конфигурацию systemd (обязательно после создания/изменения файлов!)
    sudo systemctl daemon-reload
    
    # Включить и сразу запустить
    sudo systemctl enable --now myscript.service
    
    # Проверить статус
    sudo systemctl status myscript.service
    

Проверка результата

  1. Статус сервиса: systemctl status <service> должен показывать active (running).
  2. Автозапуск: systemctl is-enabled <service> вернёт enabled.
  3. Логи: journalctl -u <service> -n 20 покажет последние 20 строк логов без ошибок.
  4. Функциональность: Если это веб-сервер (nginx/apache), проверьте ответ curl http://localhost. Если это фоновый процесс — убедитесь, что он работает (ps aux | grep <process>).

Возможные проблемы

Проблема / СимптомВероятная причинаРешение
Failed to start <service>. Unit <service> not found.Неверное имя сервиса или файл .service отсутствует.Проверьте точное имя через systemctl list-unit-files | grep <часть_имени>. Убедитесь, что файл лежит в /etc/systemd/system/ или /lib/systemd/system/.
Permission denied или Access denied при start/stopЗапуск без sudo или отсутствие прав в файле сервиса.Используйте sudo. Проверьте права на файл сервиса: ls -l /etc/systemd/system/<service>.service.
Сервис запускается, но сразу падает (active (exited) или failed).Ошибка в команде ExecStart, отсутствие зависимостей, права на скрипт/бинарник.Смотрите логи: sudo journalctl -u <service> -b. Проверьте, что скрипт исполняемый (chmod +x) и указан абсолютный путь.
Failed to execute command: Permission denied (в логах journalctl)Пользователь, указанный в User=, не имеет прав на доступ к необходимым файлам/портам.Исправьте права на файлы/каталоги (chown, chmod) или запускайте от root (не рекомендуется).
Изменения в файле сервиса не применяются после systemctl restart.Забыли выполнить systemctl daemon-reload после редактирования файла.Всегда выполняйте sudo systemctl daemon-reload после изменения .service файлов.
masked статус (сервис заблокирован).Кто-то выполнил systemctl mask.Разблокируйте: sudo systemctl unmask <service>, затем sudo systemctl enable <service>.

Часто задаваемые вопросы

В чём разница между systemctl start и systemctl enable?
Как посмотреть логи сервиса, который упал при старте?
Что делать, если сервис не запускается и пишет 'Unit not found'?
Как временно отключить автозапуск сервиса без удаления?

Полезное

Проверка наличия systemd
Базовые операции: запуск, остановка, перезапуск
Просмотр статуса и включение автозапуска
Работа с журналом (journalctl)
Создание собственного сервиса