Сообщить об ошибке.

Руководство по работе с systemctl в Linux (systemd)

Управления службами (юнитами) в системе с systemd

Содержание:

systemctl - основная утилита для управления службами (юнитами) в системах Linux с systemd.

Поиск служб в systemd

Список всех служб

systemctl list-units --type=service

Или только активные:

systemctl list-units --type=service --state=running#

Список служб в автозагрузке

systemctl list-unit-files --type=service --state=enabled

Поиск службы по имени

systemctl list-unit-files | grep "имя_службы"

Или:

systemctl status "*имя_службы*"

Проверить, включена ли служба в автозагрузку

systemctl is-enabled имя_службы
  • enabled - в автозагрузке
  • disabled - не в автозагрузке
  • static - не может быть включена/отключена (зависит от других служб)

Управление службами (запуск, остановка, перезагрузка, отключение)

В Linux с использованием systemd управление службами (их добавлением, удалением, включением и отключением в автозагрузке) выполняется с помощью команды systemctl.

Добавление службы в автозагрузку

Если служба уже установлена в системе (например, nginx, docker и т. д.), её можно включить в автозагрузку, чтобы она запускалась при старте системы:

sudo systemctl enable имя_службы.service

Удаление службы из автозагрузки

Чтобы отключить службу от автозагрузки (но не останавливать её сейчас):

sudo systemctl disable имя_службы.service

Включение/выключение службы без перезагрузки

  • Запустить службу (без добавления в автозагрузку):

    sudo systemctl start имя_службы.service
    
  • Остановить службу (но не убирать из автозагрузки, если она там есть):

    sudo systemctl stop имя_службы.service
    
  • Перезапустить службу (удобно после изменения конфига):

    sudo systemctl restart имя_службы.service
    
  • Проверить статус службы:

    sudo systemctl status имя_службы.service
    

Полное удаление службы (если она больше не нужна)

Если служба была установлена из пакета (apt, yum, dnf и т. д.), лучше удалить её через пакетный менеджер:

## Для Debian/Ubuntu
sudo apt purge имя_пакета

## Для CentOS/RHEL/Fedora
sudo yum remove имя_пакета

Если служба добавлена вручную (кастомный юнит), можно удалить её файл:

sudo rm /etc/systemd/system/имя_службы.service
## Обновить конфигурацию systemd
sudo systemctl daemon-reload

Просмотр всех служб в автозагрузке

systemctl list-unit-files --type=service --state=enabled

Или все загруженные службы:

systemctl list-units --type=service

Сводная таблица по управлению службами через systemctl

ДействиеКоманда
Включить в автозагрузкуsudo systemctl enable имя_службы
Отключить из автозагрузкиsudo systemctl disable имя_службы
Запустить службуsudo systemctl start имя_службы
Остановить службуsudo systemctl stop имя_службы
Перезапустить службуsudo systemctl restart имя_службы
Проверить статусsudo systemctl status имя_службы
Полная перезагрузка (если служба не отвечает)sudo systemctl reload-or-restart имя_службы
Удалить службу (если пакет)sudo apt purge имя_пакета (или yum remove)

После изменений можно проверить, загружается ли служба:

systemctl is-enabled имя_службы

Просмотр логов служб (journalctl)

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

Логи конкретной службы

sudo journalctl -u имя_службы

Логи за последние 30 минут

sudo journalctl -u имя_службы --since "30 minutes ago"

Логи в реальном времени (как tail -f)

sudo journalctl -u имя_службы -f

Логи с указанием времени

sudo journalctl -u имя_службы --since "2024-01-01" --until "2024-01-02"

Показать только ошибки

sudo journalctl -u имя_службы -p err

Очистка логов (если их слишком много)

sudo journalctl --vacuum-size=100M  # Оставить последние 100 МБ

Анализ зависимостей службы

Какие службы зависят от данной?

systemctl list-dependencies имя_службы

Какие службы требуются для данной?

systemctl list-dependencies --reverse имя_службы

Проверить, какие файлы использует служба

systemctl show имя_службы | grep -i "execstart\|config"

Дополнительные полезные команды

Вот ваша таблица, оформленная с использованием Bootstrap 4:

ДействиеКоманда
Проверить, активна ли службаsystemctl is-active имя_службы
Показать все failed-службыsystemctl --failed
Маскировать службу (запретить запуск)sudo systemctl mask имя_службы
Размаскировать службуsudo systemctl unmask имя_службы
Перезагрузить все службыsudo systemctl daemon-reload

Конфигурование systemd для управления службами

Конфигурация службы systemd состоит из нескольких секций ([Unit], [Service], [Install]), каждая из которых содержит свои параметры. Ниже приведен полный список наиболее важных директив с пояснениями.

Список параметров конфигурации systemd для управления службами

Секция [Unit] (общие настройки службы)

Параметры, описывающие службу и её зависимости.

ПараметрОписание
Description=Описание службы (отображается в systemctl status).
Documentation=Ссылка на документацию (URL, man-страницу).
Requires=Список служб, от которых зависит данная. Если они не работают, служба не запустится.
Wants=Мягкая зависимость: служба попытается запуститься, даже если зависимости не активны.
After=Запускать службу после указанных юнитов.
Before=Запускать службу до указанных юнитов.
BindsTo=Жёсткая привязка: если зависимость останавливается, служба тоже останавливается.
Conflicts=Если указанная служба запущена, данная служба не запустится.
ConditionPathExists=Запускать службу, только если существует указанный файл.
ConditionPathIsDirectory=Проверка, что путь является директорией.
AssertPathExists=Аналогично ConditionPathExists=, но с ошибкой, если условие не выполнено.
OnFailure=Запускать другой юнит, если служба падает.
Секция [Service] (настройки выполнения)

Параметры, управляющие запуском и поведением процесса.

Основные параметры

ПараметрОписание
Type=Тип службы: simple (по умолчанию), forking (демон форкается), oneshot (однократный запуск), notify (уведомляет systemd о готовности), idle (запускается, когда система простаивает).
ExecStart=Команда для запуска службы (обязательный параметр!).
ExecStartPre=Команды, выполняемые перед ExecStart=.
ExecStartPost=Команды, выполняемые после ExecStart=.
ExecStop=Команда для остановки службы.
ExecStopPost=Команды, выполняемые после остановки.
ExecReload=Команда для перезагрузки (если поддерживается).
Restart=Когда перезапускать службу: no (никогда), on-success (при успешном завершении), on-failure (при ошибке), always (всегда).
RestartSec=Задержка перед перезапуском (например, RestartSec=5s.
TimeoutStartSec=Максимальное время запуска (по умолчанию 90 сек).
TimeoutStopSec=Максимальное время остановки (по умолчанию 90 сек).
User=Под каким пользователем запускать (например, User=nginx).
Group=Группа пользователя для запуска.
WorkingDirectory=Рабочая директория процесса.
Environment=Переменные окружения (например, Environment="VAR=value").
EnvironmentFile=Файл с переменными окружения (например, EnvironmentFile=/etc/sysconfig/myservice).

Дополнительные параметры

ПараметрОписание
LimitNOFILE=Лимит на количество открытых файлов (например, LimitNOFILE=65536).
LimitNPROC=Лимит на количество процессов.
Nice=Приоритет процесса (от -20 до 19).
IOSchedulingClass=Класс планирования ввода-вывода (real-time, best-effort, idle).
CPUSchedulingPriority=Приоритет планирования CPU (для реального времени).
PrivateTmp=Использовать приватный /tmp (yes/no).
ProtectHome=Запретить доступ к домашним директориям (read-only, no).
ProtectSystem=Защита системных файлов (strict, full, no).
NoNewPrivileges=Запретить процессу повышать привилегии (yes/no).
KillMode=Как убивать процесс: control-group (все процессы группы), process (только основной), mixed (основной + часть дочерних).
KillSignal=Какой сигнал отправлять при остановке (по умолчанию SIGTERM).

Управление памятью (RAM)

ПараметрОписаниеПример
MemoryMax=Максимальный лимит RAM (процесс будет убит при превышении)MemoryMax=500M
MemoryHigh=Мягкий лимит (ядро начнёт активно вытеснять память)MemoryHigh=300M
MemoryLimit=Устаревший (используйте MemoryMax=)MemoryLimit=1G
MemorySwapMax=Лимит swap-памятиMemorySwapMax=200M
MemoryLow=Гарантированный минимум RAM (для важных процессов)MemoryLow=100M
OOMScoreAdjust=Приоритет при Out-Of-Memory (-1000 до 1000)OOMScoreAdjust=-500

Управление CPU

ПараметрОписаниеПример
CPUQuota=Максимальная доля CPU (в процентах)CPUQuota=50%
CPUWeight=Приоритет CPU (110000, аналог nice)CPUWeight=500
CPUAffinity=Закрепить за определёнными ядрамиCPUAffinity=0,1
StartupCPUWeight=Приоритет при старте системыStartupCPUWeight=1000
AllowedCPUs=Список разрешённых CPU (изолирование)AllowedCPUs=0-3

Управление дисковым I/O

ПараметрОписаниеПример
IOWeight=Приоритет I/O (110000)IOWeight=100
StartupIOWeight=Приоритет I/O при стартеStartupIOWeight=500
IODeviceWeight=Приоритет для конкретного устройстваIODeviceWeight=/dev/sda 800
IOReadBandwidthMax=Лимит чтения (байт/сек)IOReadBandwidthMax=/dev/sda 10M
IOWriteBandwidthMax=Лимит записи (байт/сек)IOWriteBandwidthMax=/dev/sda 5M

Управление сетью (Network)

ПараметрОписаниеПример
IPAccounting=Включить учёт трафика (yes/no)IPAccounting=yes
IPAddressAllow=Разрешить определённые IPIPAddressAllow=192.168.1.0/24
IPAddressDeny=Запретить определённые IPIPAddressDeny=10.0.0.1
SocketBindAllow=Разрешить binding к портамSocketBindAllow=80,443
SocketBindDeny=Запретить binding к портамSocketBindDeny=22

Дополнительные cgroup-ограничения

ПараметрОписаниеПример
TasksMax=Макс. число процессов в службеTasksMax=100
BlockIOWeight=Приоритет блочного I/O (101000)BlockIOWeight=500
DeviceAllow=Разрешить доступ к устройствуDeviceAllow=/dev/nvidia0 rw
DevicePolicy=Политика доступа к устройствам (strict/closed/auto)DevicePolicy=strict

Как проверить ограничения?

# Просмотр cgroup-лимитов
systemd-cgtop
systemctl show myapp | grep Memory
cat /sys/fs/cgroup/system.slice/myapp.service/memory.max
Секция [Install] (настройки автозагрузки)

Параметры, определяющие, как служба включается в автозагрузку.

ПараметрОписание
WantedBy=В каких target'ах должна быть служба (например, multi-user.target).
RequiredBy=Жёсткая зависимость для target'а.
Alias=Альтернативное имя службы.
Also=Дополнительные юниты, которые нужно включить/отключить вместе с этой службой.

Пример полного конфига службы

[Unit]
Description=My Custom Service
Documentation=man:myapp(1)
After=network.target
Requires=postgresql.service
Wants=redis.service
ConditionPathExists=/var/lib/myapp/config.ini

[Service]
Type=simple
User=myapp
Group=myapp
WorkingDirectory=/var/lib/myapp
ExecStart=/usr/bin/myapp --daemon
ExecStartPre=/usr/bin/setup-myapp
ExecStop=/usr/bin/myapp --shutdown
Restart=on-failure
RestartSec=5s
Environment="APP_MODE=production"
EnvironmentFile=/etc/default/myapp
LimitNOFILE=65536
MemoryMax=1G
MemoryHigh=800M
CPUQuota=70%
CPUWeight=300
IOWeight=200
TasksMax=500
DeviceAllow=/dev/sdb rw
ProtectSystem=full
NoNewPrivileges=yes

[Install]
WantedBy=multi-user.target

Как применить изменения?

После редактирования конфига:

sudo systemctl daemon-reload  # Перезагрузить конфигурацию systemd
sudo systemctl restart myapp # Перезапустить службу

Для более сложных сценариев (cgroups, sandboxing) см. man systemd.exec и man systemd.service.