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.
Бесплатный онлайн-инструмент — проверка HTTP-заголовков: результат мгновенно, без регистрации.
systemctl daemon-reload — reload unitssystemctl enable myapp — auto-start on bootsystemctl start myapp + systemctl statusjournalctl -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 без restart | ExecReload=/bin/kill -HUP $MAINPID
# systemctl reload myapp |
Environment="KEY=value", не как в bashuseradd -r -s /bin/false nodejsjournalctl -u myappsystemctl daemon-reload после изменения unit → старый configЧтобы создать 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.
Файл конфигурации systemd service состоит из нескольких секций. Основные из них:
В секции [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 для простого веб-сервера на Python с использованием Flask. Предположим, у вас есть приложение, расположенное по пути /opt/my-flask-app/app.py.
1. Создайте файл конфигурации:
sudo nano /etc/systemd/system/my-flask-app.service2. Добавьте следующее содержимое:
[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.target3. Сохраните файл и закройте редактор.
4. Перезагрузите systemd для применения изменений:
sudo systemctl daemon-reload5. Активируйте и запустите сервис:
sudo systemctl enable my-flask-app
sudo systemctl start my-flask-app6. Проверьте статус сервиса:
sudo systemctl status my-flask-appЕсли всё настроено правильно, вы увидите сообщение о том, что сервис активен и работает. В случае ошибок вы можете изучить логи с помощью команды:
journalctl -u my-flask-appЭто основа работы с systemd services. Следуя этим шагам, вы сможете создать и управлять собственными сервисами в системе.
Чтобы создать systemd service, необходимо создать конфигурационный файл с расширением .service в каталоге /etc/systemd/system/. В этом файле указываются параметры, такие как ExecStart для запуска команды, User для указания пользователя и другие настройки. После создания файла выполните команду systemctl daemon-reload для перезагрузки демона systemd и systemctl start имя_сервиса для запуска вашего сервиса.
Создание 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
В этом примере:
После создания файла необходимо выполнить команду 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 — built-in Linux, zero dependencies. pm2 — specialized для Node.js (cluster mode, zero-downtime reload). На простом app — systemd.
on-failure (restart on non-zero exit) — стандарт. always — restart даже при normal exit (useful для daemon). no — только manual.
<code>TimeoutStopSec=30s</code> — systemd ждёт 30 сек перед SIGKILL. App должен handle SIGTERM и cleanly exit.
journald автоматически rotates. Settings: <code>/etc/systemd/journald.conf</code> → SystemMaxUse=1G, MaxRetentionSec=30d.
Бесплатный тариф — 10 мониторов, проверки каждые 5 мин, без карты. Платные тарифы — интервал от 1 минуты и проверки из нескольких регионов.