====== 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
===== Создание пользовательской службы =====
* Пользовательские сервисы работают с ключом ''--user''
* Они выполняются с правами текущего пользователя
* Для некоторых операций (например, работы с сетью) могут потребоваться дополнительные разрешения
* Логи можно просматривать через ''journalctl --user -u myservice.service''
==== Создание структуры каталогов ====
Сначала создайте необходимые каталоги в вашей домашней директории
mkdir -p ~/.config/systemd/user/
==== Создание unit-файла ====
Создайте файл сервиса в этом каталоге, например ''myservice.service''
nano ~/.config/systemd/user/myservice.service
==== Активация пользовательского менеджера systemd ====
Перед использованием убедитесь, что пользовательский менеджер systemd запущен
systemctl --user enable --now dbus.service
==== Управление сервисом ====
# Перечитать конфигурации
systemctl --user daemon-reload
# Включить автозагрузку сервиса
systemctl --user enable myservice.service
# Запустить сервис
systemctl --user start myservice.service
# Проверить статус
systemctl --user status myservice.service
# Остановить сервис
systemctl --user stop myservice.service
# Отключить автозагрузку
systemctl --user disable myservice.service
==== Автозапуск при входе пользователя ====
По умолчанию пользовательские сервисы не запускаются при загрузке системы, а только при входе пользователя.
Для включения постоянной работы
sudo loginctl enable-linger username