Skip to content

Как создать systemd service

Коротко:

systemd — init system на всех современных Linux. Service unit = .service file описывающий как запускать/останавливать/перезапускать daemon. Замена для supervisord, pm2 (для Node), rc.d. Auto-start на boot, auto-restart при crash, journalctl для logs, systemctl для control. Минимальный unit — 10 строк.

Ниже: пошаговая инструкция, рабочие примеры, типичные ошибки, FAQ.

Пошаговая настройка

  1. Создайте /etc/systemd/system/myapp.service
  2. [Unit] секция: Description, After=network.target
  3. [Service] секция: ExecStart, User, WorkingDirectory, Restart=on-failure
  4. [Install] WantedBy=multi-user.target
  5. systemctl daemon-reload — reload units
  6. systemctl enable myapp — auto-start on boot
  7. systemctl start myapp + systemctl status
  8. Logs: journalctl -u myapp -f (live tail)

Рабочие примеры

СценарийКонфиг
Простой Node.js service[Unit] Description=My App After=network.target [Service] Type=simple User=nodejs WorkingDirectory=/opt/myapp ExecStart=/usr/bin/node /opt/myapp/server.js Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target
Python с venv[Service] Type=simple User=app WorkingDirectory=/opt/myapp ExecStart=/opt/myapp/venv/bin/python /opt/myapp/app.py Environment="PATH=/opt/myapp/venv/bin" Restart=on-failure
Systemd hardening (sandboxing)[Service] NoNewPrivileges=true PrivateTmp=true ProtectSystem=strict ProtectHome=true ReadWritePaths=/var/log/myapp
Timer (как cron)# /etc/systemd/system/backup.timer [Timer] OnCalendar=*-*-* 03:00:00 Persistent=true [Install] WantedBy=timers.target
Reload config без restartExecReload=/bin/kill -HUP $MAINPID # systemctl reload myapp

Типичные ошибки

  • ExecStart с relative path — "not found". Всегда absolute /usr/bin/node
  • Environment variables: Environment="KEY=value", не как в bash
  • User=root — anti-pattern. Создайте dedicated user: useradd -r -s /bin/false nodejs
  • Logs не пишутся в файл — они уходят в journald: journalctl -u myapp
  • Отсутствует systemctl daemon-reload после изменения unit → старый config

Больше по теме

Часто задаваемые вопросы

systemd vs pm2 / supervisord?

systemd — built-in Linux, zero dependencies. pm2 — specialized для Node.js (cluster mode, zero-downtime reload). На простом app — systemd.

Restart policy — какую выбрать?

on-failure (restart on non-zero exit) — стандарт. always — restart даже при normal exit (useful для daemon). no — только manual.

Как сделать graceful shutdown?

<code>TimeoutStopSec=30s</code> — systemd ждёт 30 сек перед SIGKILL. App должен handle SIGTERM и cleanly exit.

Logs огромные — как ротация?

journald автоматически rotates. Settings: <code>/etc/systemd/journald.conf</code> → SystemMaxUse=1G, MaxRetentionSec=30d.