systemctl - основная утилита для управления службами (юнитами) в системах Linux с 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 имя_службы
systemd хранит логи в бинарном формате, для просмотра используется journalctl.
sudo journalctl -u имя_службы
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 (1–10000, аналог nice) | CPUWeight=500 |
CPUAffinity= | Закрепить за определёнными ядрами | CPUAffinity=0,1 |
StartupCPUWeight= | Приоритет при старте системы | StartupCPUWeight=1000 |
AllowedCPUs= | Список разрешённых CPU (изолирование) | AllowedCPUs=0-3 |
Управление дисковым I/O
| Параметр | Описание | Пример |
|---|---|---|
IOWeight= | Приоритет I/O (1–10000) | 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= | Разрешить определённые IP | IPAddressAllow=192.168.1.0/24 |
IPAddressDeny= | Запретить определённые IP | IPAddressDeny=10.0.0.1 |
SocketBindAllow= | Разрешить binding к портам | SocketBindAllow=80,443 |
SocketBindDeny= | Запретить binding к портам | SocketBindDeny=22 |
Дополнительные cgroup-ограничения
| Параметр | Описание | Пример |
|---|---|---|
TasksMax= | Макс. число процессов в службе | TasksMax=100 |
BlockIOWeight= | Приоритет блочного I/O (10–1000) | 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.