Как пользоваться
- Введите имя службы (имя файла без .service), описание и команду с полным путём.
- Укажите рабочую папку и для системной службы — пользователя. Если оставить его пустым, служба будет работать от root.
- Выберите тип и правило перезапуска, добавьте переменные окружения по одной в строке и отметьте нужные параметры.
- Сохраните unit-файл по показанному пути и выполните команды: daemon-reload, enable –now, затем status и journalctl для проверки.
Как это работает
В unit-файле три раздела:
- [Unit]: описание и порядок запуска. Системная служба получает After=network.target, а если ей нужна сеть — After= и Wants=network-online.target. Служба пользователя не получает сетевых зависимостей: менеджер пользователя не может ждать системные юниты.
- [Service]: Type, User и Group, WorkingDirectory, по одной строке Environment=“KEY=value” на переменную (с экранированными \ и “), EnvironmentFile, ExecStart, Restart и RestartSec, а с защитой — NoNewPrivileges=true и PrivateTmp=true.
- [Install]: WantedBy=multi-user.target для системной службы или default.target для пользовательской — к этой цели её и подключает enable.
Пример
Форма по умолчанию (имя myapp, сервер на Node.js, пользователь myapp, перезапуск при ошибке через 5 с, две переменные, network-online, защита) даёт:
[Unit]
Description=My app
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=myapp
WorkingDirectory=/opt/myapp
Environment="NODE_ENV=production"
Environment="PORT=3000"
ExecStart=/usr/bin/node /opt/myapp/server.js
Restart=on-failure
RestartSec=5
NoNewPrivileges=true
PrivateTmp=true
[Install]
WantedBy=multi-user.target
Сохраните его как /etc/systemd/system/myapp.service и запустите командами sudo systemctl daemon-reload и sudo systemctl enable --now myapp.service.
Советы
- systemd раскрывает спецификаторы % в ExecStart и Environment: для знака процента пишите %%.
- ExecStart запускается не через оболочку, поэтому конвейеры, && и перенаправления не работают; оберните их в /bin/sh -c ‘…’ или в скрипт.
- Не храните секреты в unit-файле: вынесите их в EnvironmentFile, доступный только root.
- После каждого изменения файла выполняйте daemon-reload и перезапускайте службу.