Генератор unit-файла systemd

Укажите команду, пользователя и правила перезапуска — и получите готовый файл .service для systemd, путь, куда его сохранить, и команды systemctl, чтобы запустить службу сейчас и при каждой загрузке. Подходит и для системных служб, и для пользовательских без root.

Установить как
По одной KEY=value в строке; строки с # пропускаются

Сохраните как /etc/systemd/system/myapp.service

Работает в браузере: всё, что вы вводите, никуда не отправляется.

Как пользоваться

  1. Введите имя службы (имя файла без .service), описание и команду с полным путём.
  2. Укажите рабочую папку и для системной службы — пользователя. Если оставить его пустым, служба будет работать от root.
  3. Выберите тип и правило перезапуска, добавьте переменные окружения по одной в строке и отметьте нужные параметры.
  4. Сохраните 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 и перезапускайте службу.

Частые вопросы

Куда сохранять файл?

Системная служба — в /etc/systemd/system/<имя>.service (нужен root). Служба пользователя — в ~/.config/systemd/user/<имя>.service, она работает под вашей учётной записью. Путь показан под unit-файлом.

Какой Type выбрать?

simple подходит большинству программ, которые работают на переднем плане: серверам на Node.js, Python, Go. forking нужен только старым демонам, которые уходят в фон и завершают исходный процесс, oneshot — скриптам, которые отработали и закончились, notify — программам, вызывающим sd_notify при готовности.

Чем Restart=on-failure отличается от always?

on-failure перезапускает службу, если она завершилась с кодом ошибки, была убита сигналом или не уложилась в тайм-аут, но не после нормального завершения. always перезапускает в любом случае. RestartSec задаёт паузу перед перезапуском.

Почему network-online.target, а не network.target?

After=network.target лишь ставит службу после настройки сетевого стека, а не после получения адреса. Если службе при старте нужно куда-то подключиться, network-online.target вместе с Wants= дождётся, пока сеть действительно поднимется.

Нужен ли полный путь в ExecStart?

systemd принимает абсолютный путь или просто имя программы, которое ищет в собственном фиксированном списке папок (например, /usr/local/bin и /usr/bin), а не в PATH вашей оболочки. Относительный путь вроде ./app не допускается. Надёжнее всего полный путь.

Может ли служба пользователя стартовать при загрузке?

Служба пользователя запускается при входе в систему. Чтобы она стартовала при загрузке без входа, один раз выполните sudo loginctl enable-linger <ваш пользователь>.

Ещё в разделе «Разработчикам»

Все инструменты раздела: Разработчикам ·Обновлено 4 ноября 2026 г.

Настройки конфиденциальности

Google Analytics показывает нам, какими инструментами пользуются и работают ли они. Он может ставить cookie. Ваш выбор сохраняется в этом браузере.