Перейти к основному содержимому
Вернуться в категорию

Управление службами Systemd: start, stop, enable

Полное руководство по командам systemctl, файлам unit, созданию пользовательских служб, мониторингу журналов journalctl и устранению неполадок systemd на Linux-серверах.

Время чтения: 12 мин Управление сервером
systemdsystemctlслужбаlinuxjournalctlunit filedaemon

Содержание

Управление службами Systemd: start, stop, enable

Systemd — это система инициализации и менеджер служб, используемый большинством современных дистрибутивов Linux. На Ubuntu, Debian, CentOS, AlmaLinux и RHEL systemd управляет всем: от запуска системы до управления службами. В этом руководстве рассматриваются команды systemctl, файлы unit и создание пользовательских служб.

Что такое Systemd?

Systemd — первый процесс, запускаемый после ядра Linux (PID 1). Его задачи включают:

  • Запуск и остановку системных служб
  • Управление зависимостями между службами
  • Сбор системных журналов (journald)
  • Мониторинг состояния системы

Systemd заменил старую систему инициализации SysV. Хотя скрипты /etc/init.d/ всё ещё работают, файлы unit systemd теперь являются предпочтительным подходом.

Основные команды systemctl

Проверка статуса службы

hljs bash
# Просмотр статуса службы
sudo systemctl status nginx

# Проверка, запущена ли служба
sudo systemctl is-active nginx

# Проверка, включена ли служба
sudo systemctl is-enabled nginx

# Список всех запущенных служб
sudo systemctl list-units --type=service --state=running

# Список неудавшихся служб
sudo systemctl list-units --type=service --state=failed

Запуск и остановка служб

hljs bash
# Запустить службу
sudo systemctl start nginx

# Остановить службу
sudo systemctl stop nginx

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

# Перезагрузить конфигурацию без остановки
sudo systemctl reload nginx

# Перезагрузить если возможно, иначе перезапустить
sudo systemctl reload-or-restart nginx

Включение и отключение служб

hljs bash
# Включить автозапуск при загрузке
sudo systemctl enable nginx

# Запустить и включить автозапуск
sudo systemctl enable --now nginx

# Отключить автозапуск
sudo systemctl disable nginx

# Остановить и отключить
sudo systemctl disable --now nginx

# Заблокировать службу
sudo systemctl mask nginx

# Разблокировать службу
sudo systemctl unmask nginx

Файлы unit Systemd

Файлы unit определяют, как systemd управляет службами. Два основных расположения:

  • /lib/systemd/system/ — файлы unit, установленные менеджером пакетов
  • /etc/systemd/system/ — файлы unit, созданные/настроенные администратором
hljs bash
# Просмотр файла unit службы
sudo systemctl cat nginx

# Найти расположение файла unit
sudo systemctl show nginx --property=FragmentPath

# Список всех файлов unit
sudo systemctl list-unit-files --type=service

Структура файла unit

Файл .service имеет три основных раздела:

hljs ini
[Unit]
Description=Nginx HTTP Server
After=network.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

Создание пользовательской службы

Пример: Служба для Node.js-приложения

hljs bash
# Создать файл unit
sudo nano /etc/systemd/system/myapp.service
hljs ini
[Unit]
Description=My Node.js Application
After=network.target

[Service]
Type=simple
User=www-data
WorkingDirectory=/var/www/myapp
ExecStart=/usr/bin/node /var/www/myapp/app.js
Restart=on-failure
RestartSec=10
StandardOutput=journal
StandardError=journal
Environment=NODE_ENV=production
Environment=PORT=3000

[Install]
WantedBy=multi-user.target
hljs bash
# Уведомить systemd о новом файле unit
sudo systemctl daemon-reload

# Запустить и включить службу
sudo systemctl enable --now myapp

# Проверить статус
sudo systemctl status myapp

Типы служб

ТипОписаниеПрименение
simpleОсновной процесс запускается напрямуюNode.js, Python
forkingОсновной процесс разветвляется и завершаетсяNginx, Apache
oneshotОдноразовая задачаСкрипты запуска
notifyОтправляет уведомление о готовностиПриложения с поддержкой systemd

Управление журналами с journalctl

hljs bash
# Просмотр журналов конкретной службы
sudo journalctl -u nginx

# Последние 50 строк
sudo journalctl -u nginx -n 50

# Отслеживание журналов в реальном времени
sudo journalctl -u nginx -f

# Журналы за последний час
sudo journalctl -u nginx --since "1 hour ago"

# Только ошибки
sudo journalctl -u nginx -p err

# Проверить использование диска журналами
sudo journalctl --disk-usage

# Очистить старые журналы
sudo journalctl --vacuum-time=2weeks

Устранение неполадок

Служба не запускается

hljs bash
# Получить подробный статус
sudo systemctl status myapp -l

# Проверить последние журналы
sudo journalctl -u myapp -n 100 --no-pager

# Проверить файл unit
sudo systemd-analyze verify /etc/systemd/system/myapp.service

Забыли выполнить daemon-reload

hljs bash
# Всегда выполняйте после изменения файла unit
sudo systemctl daemon-reload

При разработке службы начните с Type=simple и Restart=on-failure. Оптимизируйте другие настройки после стабилизации службы.

Таймеры Systemd (альтернатива Cron)

hljs ini
[Unit]
Description=Daily Backup Timer

[Timer]
OnCalendar=daily
Persistent=true

[Install]
WantedBy=timers.target
hljs bash
# Включить таймер
sudo systemctl enable --now backup.timer

# Список всех таймеров
sudo systemctl list-timers

Заключение

Systemd — краеугольный камень современного управления Linux-серверами. Изучение команд systemctl и структуры файлов unit позволяет надёжно управлять службами. На серверах REXE вы можете создавать пользовательские службы, чтобы ваши приложения автоматически запускались после перезагрузки системы.