Инструменты пользователя

Инструменты сайта


flip:linux:systemd

Это старая версия документа!


SYSTEMD

Создание сервиса systemd

Каталог с конфигурациями: /etc/systemd/system/
Пример: myservice.service

Проверить синтаксис

systemd-analyze verify /etc/systemd/system/myservice.service

Обновить список конфигураций

systemctl daemon-reload

Включить сервис

systemctl enable myservice

Отключить

systemctl disable myservice

Настройка

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

(Общие для всех типов unit-файлов)

[Unit]
Description=Описание сервиса
Documentation=URL или man-страница
After=network.target           # Запускать после этих юнитов
Before=some.target             # Запускать перед этими юнитами
Requires=postgresql.service    # Жёсткая зависимость (если postgresql не запустится, этот сервис тоже не запустится)
Wants=redis.service            # Мягкая зависимость (сервис попытается запустить redis, но не зависит от его успеха)
Conflicts=old_service.service  # Сервис не может работать одновременно с old_service

Параметры [Service]

(Специфичные для сервисов)

Тип сервиса

Type=simple           # Простой запуск (по умолчанию). systemd считает сервис активным сразу после fork.
Type=forking          # Для демонов, которые сами форкаются (нужен PIDFile=)
Type=oneshot          # Для скриптов, которые завершаются (с Optional ExecStop=)
Type=notify           # Сервис уведомит systemd о готовности (через sd_notify)
Type=idle             # Запустится, когда система простаивает
Type=dbus             # Активируется при появлении D-Bus имени
Type=exec             # Как simple, но ждёт завершения ExecStart= перед запуском других юнитов

Команды

ExecStart=/path/to/bin arg1 arg2  # Основная команда
ExecStartPre=/bin/pre-script.sh   # Подготовка перед ExecStart
ExecStartPost=/bin/after-start.sh # Действия после успешного старта
ExecReload=/bin/reload-script     # Команда для systemctl reload
ExecStop=/bin/cleanup.sh          # Команда для остановки
ExecStopPost=/bin/after-stop.sh   # Действия после остановки

Управление процессом

User=nobody                       # От имени какого пользователя запускать
Group=nogroup                     # Группа процесса
WorkingDirectory=/path/to/dir     # Рабочая директория
Environment="VAR1=value"          # Переменные окружения
EnvironmentFile=/etc/conf.d/myenv # Файл с переменными (как source в bash)
PIDFile=/run/service.pid          # Для Type=forking (указывает на файл с PID)
UMask=0022                        # Маска прав для файлов
Nice=-10                          # Приоритет процесса (от -20 до 19)
OOMScoreAdjust=-500               # Защита от OOM-killer (меньше – реже убивается)

Рестарт и таймауты

Restart=no              # Не перезапускать (по умолчанию)
Restart=on-success      # Только при успешном завершении (код 0)
Restart=on-failure      # При ошибке (ненулевой код или сигнал)
Restart=on-abnormal     # При нестандартном завершении (сигнал)
Restart=on-watchdog     # При зависании (по watchdog)
Restart=always          # Перезапускать всегда, даже при ручном stop
RestartSec=5s           # Пауза перед рестартом (по умолчанию 100ms)
TimeoutStartSec=30s     # Максимальное время запуска
TimeoutStopSec=10s      # Максимальное время остановки
TimeoutSec=30s          # Общий таймаут для старта/останова
RuntimeMaxSec=1h        # Максимальное время работы сервиса

Лимиты

LimitNOFILE=65536       # Макс. число открытых файлов
LimitNPROC=512          # Макс. число процессов
LimitCORE=infinity      # Макс. размер core-файла
MemoryLimit=2G          # Лимит оперативной памяти
CPUQuota=150%           # Лимит CPU (может быть >100% для многопоточности)

Дополнительно

StandardOutput=journal  # Куда писать stdout (journal, syslog, file:/path)
StandardError=inherit   # Куда писать stderr (inherit – как stdout)
SyslogIdentifier=myapp  # Метка в журнале (по умолчанию – имя сервиса)
KillMode=process        # Что убивать при остановке (process, mixed, control-group)
RemainAfterExit=yes     # Считать сервис активным после завершения (для oneshot)
SuccessExitStatus=143   # Какие коды считать успешными (помимо 0)

Секция [Install]

(Для systemctl enable)

[Install]
WantedBy=multi-user.target  # В какой target добавить сервис
Alias=myservice.alias       # Альтернативное имя для сервиса
RequiredBy=other.target     # Обратная зависимость
Also=other.service          # Дополнительные юниты для включения/выключения

Примеры

Запуск службы x11vnc

nano /etc/systemd/system/x11vncsrv.service

[Unit]
# описание
Description=X11VNC Server
# здесь используется ключи времени с указанием цели или другой службы
After=prefdm.service

[Service]
# от какого пользователя запускать службу, не обязательно
User=root
# перезапуск службы, не обязательно
Restart=on-failure
#выполняемая команда
ExecStart=/usr/bin/x11vnc -auth /var/run/lightdm/root/:0 -dontdisconnect -usepw -noxfixes -shared -forever -rfbport 5900 -rfbauth /root/.vnc/passwd

[Install]
# здесь используется ключи времени с указанием цели или другой службы
WantedBy=graphical.target
flip/linux/systemd.1743018130.txt.gz · Последнее изменение: 2025/03/26 19:42 — flip

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki