Перейти к содержимому

Своя служба в systemd

Запустить приложение как службу: unit-файл, автозапуск, перезапуск при падении и просмотр логов.

Уровень
Средний
Время чтения
3 мин чтения
Обновлено
Проверено на
Ubuntu 22.04, Ubuntu 24.04, Debian 12
Содержание
  1. Управление службами
  2. Напишите unit-файл
  3. Запустите службу
  4. Изменить чужую службу
  5. Проверьте результат
  6. Частые ошибки

Запускать бота или бэкенд через nohup или screen ненадёжно: после перезагрузки или падения процесс сам не поднимется. systemd решает это штатно — описываете программу в unit-файле, и система следит за ней сама.

Управление службами

ДействиеКоманда
Состояние и последние строки логаsystemctl status nginx
Запустить / остановитьsystemctl start nginx / systemctl stop nginx
Перезапуститьsystemctl restart nginx
Перечитать конфиг без остановкиsystemctl reload nginx
Включить автозапуск и сразу запуститьsystemctl enable --now nginx
Упавшие службыsystemctl --failed

Напишите unit-файл

Пример для приложения, которое лежит в /opt/myapp и запускается от пользователя deploy:

/etc/systemd/system/myapp.service
[Unit]Description=My applicationAfter=network-online.targetWants=network-online.target[Service]Type=simpleUser=deployWorkingDirectory=/opt/myappEnvironmentFile=/opt/myapp/.envExecStart=/opt/myapp/bin/server --port 8080Restart=on-failureRestartSec=5[Install]WantedBy=multi-user.target
  • ExecStart — полный путь к программе. systemd не читает PATH из вашей оболочки.
  • Restart=on-failure — перезапуск, если процесс завершился с ошибкой; RestartSec — пауза перед перезапуском в секундах.
  • EnvironmentFile — переменные окружения из файла вида KEY=value. Держите его с правами 600.
  • WantedBy=multi-user.target — служба стартует при обычной загрузке системы.

Запустите службу

bash
$ systemctl daemon-reload$ systemctl enable --now myapp$ systemctl status myapp

Изменить чужую службу

Unit-файлы из пакетов перезаписываются при обновлении. Для правок используйте override — он хранится отдельно в /etc/systemd/system/<служба>.d/:

bash
$ systemctl edit nginx

В открывшемся редакторе впишите только изменяемые параметры вместе с заголовком секции, например [Service] и строку LimitNOFILE=65535. systemctl edit сам перечитает конфигурацию; чтобы изменения вступили в силу, перезапустите службу.

Проверьте результат

bash
$ systemctl is-enabled myapp$ journalctl -u myapp -n 50 --no-pager

Для верности перезагрузите сервер и убедитесь, что служба поднялась сама.

Частые ошибки

  • status=203/EXEC — неверный путь в ExecStart или у файла нет права на исполнение.
  • status=217/USER — пользователя из User= не существует.
  • Служба «завершилась» сразу после старта при Type=simple — программа уходит в фон сама. Запускайте её в режиме foreground или используйте Type=forking.

Дочитайте до конца — статья засчитается в обучении автоматически.

  • systemd
  • служба
  • systemctl
  • автозапуск
  • unit

Статья помогла?