EQVPS

Как создать systemd-сервис, чтобы приложение работало постоянно

Превратите любой скрипт или приложение в управляемый сервис, который стартует при загрузке, перезапускается при падении и пишет логи в journalctl. Напишите unit-файл, включите его и проверьте статус — стандартный способ держать что-то запущенным 24/7 на Linux.

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

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

Создайте /etc/systemd/system/myapp.service:

[Unit]
Description=My application
After=network.target

[Service]
User=myapp
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/python3 /opt/myapp/run.py
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

Подстройте ExecStart, WorkingDirectory и User под ваше приложение. Restart=always — это то, что держит его живым.

2. Создайте отдельного пользователя (рекомендуется)

sudo useradd --system --no-create-home --shell /usr/sbin/nologin myapp
sudo chown -R myapp:myapp /opt/myapp

Запуск от пользователя без прав root ограничивает ущерб, если приложение когда-нибудь скомпрометируют.

3. Включите и запустите его

sudo systemctl daemon-reload
sudo systemctl enable --now myapp

enable заставляет его стартовать при загрузке; --now запускает немедленно.

4. Проверьте статус и логи

sudo systemctl status myapp
journalctl -u myapp -f       # следить за живыми логами

Повседневные команды

sudo systemctl restart myapp   # перезапуск после изменения
sudo systemctl stop myapp      # остановить
sudo systemctl disable myapp   # убрать из автозапуска

Честные предостережения

Что дальше

systemd-сервис — это то, как вы держите что угодно запущенным 24/7 — например ИИ-агента, работающего круглосуточно или ретранслятор за собственным сервером RustDesk. Если ваше приложение вместо этого в контейнере, ту же роль играет --restart unless-stopped у Docker — см. как установить Docker.

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

Зачем systemd, а не просто запустить приложение в фоне?

Процесс, запущенный в фоне (через & или nohup), умирает при перезагрузке, не возвращается после падения и раскидывает логи. systemd-сервис стартует автоматически при загрузке, перезапускается при сбое и отправляет вывод в journalctl. Это стандартный, надёжный способ держать долгоживущее приложение на Linux.

Куда кладутся unit-файлы?

Ваши собственные сервисы кладутся в /etc/systemd/system/, по одному файлу на сервис, с именем вида something.service. После создания или правки выполните 'systemctl daemon-reload', чтобы systemd подхватил изменение, затем включите и запустите его.

Что делает 'Restart=always' и есть ли минусы?

Он говорит systemd перезапускать сервис всякий раз, как тот завершается, по любой причине — это ключ к тому, чтобы что-то работало. Единственная ловушка — цикл падений: если приложение мгновенно падает при старте, systemd будет его бесконечно перезапускать. Добавьте 'RestartSec=5', чтобы разнести попытки, и посмотрите логи, чтобы устранить исходную ошибку.

Как посмотреть логи сервиса?

Используйте 'journalctl -u yourservice -f' для слежения за живым выводом или без -f для чтения истории. systemd захватывает stdout и stderr автоматически, так что заводить лог-файлы самому не нужно.

Должен ли сервис работать от root?

Лучше нет. Создайте отдельного пользователя без прав root и задайте 'User=' в unit-файле, чтобы компрометация приложения не отдавала всю машину. Запускайте от root только когда сервису это действительно нужно.

Комментарии

Пока нет комментариев. Будьте первым.

Оставить комментарий

Комментарии проходят модерацию перед публикацией.