====== 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