Skip to content
EN

Как создать 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 service: краткое руководство

Чтобы создать systemd service, вам нужно создать файл конфигурации в каталоге /etc/systemd/system с расширением .service. В этом файле укажите основные параметры, такие как [Unit], [Service] и [Install]. Например, для создания сервиса, который запускает скрипт, используйте команду sudo nano /etc/systemd/system/my-service.service и добавьте следующие строки:

[Unit]
Description=Мой сервис

[Service]
ExecStart=/usr/bin/python3 /path/to/script.py
Restart=always

[Install]
WantedBy=multi-user.target

После этого активируйте сервис с помощью команд sudo systemctl daemon-reload и sudo systemctl enable my-service.

Структура файла .service и его параметры

Файл конфигурации systemd service состоит из нескольких секций. Основные из них:

  • [Unit] — содержит описание и зависимости сервиса.
  • [Service] — определяет, как будет работать сервис, включая команду запуска и параметры перезапуска.
  • [Install] — указывает, как и когда сервис должен быть активирован.

В секции [Unit] вы можете указать такие параметры, как After= и Requires=, чтобы задать зависимости от других сервисов. Например:

[Unit]
Description=Мой сервис
After=network.target
Requires=network.target

Это гарантирует, что ваш сервис запустится только после того, как сеть будет доступна.

Секция [Service] содержит ключевые параметры, такие как:

  • ExecStart — команда, которая будет выполнена для запуска сервиса.
  • Restart — определяет поведение перезапуска (например, always или on-failure).
  • User — пользователь, от имени которого будет запущен сервис.

Пример секции [Service]:

[Service]
ExecStart=/usr/bin/node /path/to/app.js
Restart=on-failure
User=myuser

Секция [Install] указывает, как сервис будет включаться при загрузке системы. Например:

[Install]
WantedBy=multi-user.target

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

Пример создания и управления systemd service

Рассмотрим пример создания systemd service для простого веб-сервера на Python с использованием Flask. Предположим, у вас есть приложение, расположенное по пути /opt/my-flask-app/app.py.

1. Создайте файл конфигурации:

sudo nano /etc/systemd/system/my-flask-app.service

2. Добавьте следующее содержимое:

[Unit]
Description=Flask Web App
After=network.target

[Service]
ExecStart=/usr/bin/python3 /opt/my-flask-app/app.py
WorkingDirectory=/opt/my-flask-app
User=www-data
Restart=always

[Install]
WantedBy=multi-user.target

3. Сохраните файл и закройте редактор.

4. Перезагрузите systemd для применения изменений:

sudo systemctl daemon-reload

5. Активируйте и запустите сервис:

sudo systemctl enable my-flask-app
sudo systemctl start my-flask-app

6. Проверьте статус сервиса:

sudo systemctl status my-flask-app

Если всё настроено правильно, вы увидите сообщение о том, что сервис активен и работает. В случае ошибок вы можете изучить логи с помощью команды:

journalctl -u my-flask-app

Это основа работы с systemd services. Следуя этим шагам, вы сможете создать и управлять собственными сервисами в системе.

Как создать systemd service: краткое руководство

Чтобы создать systemd service, необходимо создать конфигурационный файл с расширением .service в каталоге /etc/systemd/system/. В этом файле указываются параметры, такие как ExecStart для запуска команды, User для указания пользователя и другие настройки. После создания файла выполните команду systemctl daemon-reload для перезагрузки демона systemd и systemctl start имя_сервиса для запуска вашего сервиса.

Создание конфигурационного файла systemd service

Создание systemd service начинается с написания конфигурационного файла, который определяет, как будет работать ваш сервис. Файлы .service обычно располагаются в каталоге /etc/systemd/system/. Например, создадим файл my_service.service:

[Unit]
Description=My Sample Service

[Service]
ExecStart=/usr/bin/my_application
User=my_user
Restart=on-failure

[Install]
WantedBy=multi-user.target

В этом примере:

  • [Unit] — определяет метаданные сервиса, такие как его описание.
  • [Service] — содержит параметры запуска, включая команду для запуска, пользователя и настройку перезапуска.
  • [Install] — определяет, как сервис будет интегрироваться с другими целями systemd.

После создания файла необходимо выполнить команду systemctl daemon-reload для обновления конфигурации systemd. Затем вы можете запустить сервис с помощью systemctl start my_service.service и проверить его статус с помощью systemctl status my_service.service.

Если вы хотите, чтобы ваш сервис запускался автоматически при загрузке системы, выполните команду systemctl enable my_service.service. Это создаст необходимые символические ссылки в нужных каталогах.

Важно также протестировать ваш сервис, чтобы убедиться, что он работает корректно. Для этого можно использовать journalctl -u my_service.service для просмотра логов и устранения возможных проблем.

Создание systemd service — это мощный инструмент для управления фоновыми процессами и автоматизации задач в Linux. Используя правильные параметры и настройки, вы можете создать надежный сервис, который будет работать в соответствии с вашими требованиями.

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

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

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.

Запустить инструмент, который описан в этой статье

Бесплатный тариф — 10 мониторов, проверки каждые 5 мин, без карты. Платные тарифы — интервал от 1 минуты и проверки из нескольких регионов.