EQVPS

Как да създадеш systemd услуга, за да държиш приложение работещо

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

Пускането на приложение с & или nohup е наред, докато сървърът не се рестартира, процесът не се срине, или не искаш да намериш логовете му — тогава се разпада. systemd е стандартният отговор: той стартира приложението ти при boot, рестартира го, ако умре, и хваща логовете му. Превръщането на скрипт или binary в управлявана услуга е един малък файл.

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

Пускането като non-root потребител ограничава щетите, ако приложението някога бъде компрометирано.

3. Включи и стартирай го

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

enable го кара да стартира при boot; --now го стартира незабавно.

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

sudo systemctl status myapp
journalctl -u myapp -f       # follow live logs

Ежедневни команди

sudo systemctl restart myapp   # restart after a change
sudo systemctl stop myapp      # stop it
sudo systemctl disable myapp   # stop starting on boot

Честни предупреждения

Следващи стъпки

systemd услуга е как държиш каквото и да е работещо 24/7 — например AI агент, който работи денонощно или relay-я зад self-hosted RustDesk сървър. Ако приложението ти е контейнеризирано вместо това, --restart unless-stopped на Docker играе същата роля — виж как да инсталираш Docker.

Въпроси

Защо да използвам systemd вместо просто да пусна приложението на заден фон?

Процес на заден фон (с & или nohup) умира при рестарт, не се връща, ако се срине, и разпръсква логовете си. systemd услуга стартира автоматично при boot, рестартира се при провал, и изпраща изхода си в journalctl. Това е стандартният, надежден начин да пуснеш нещо дълготрайно на Linux.

Къде отиват unit файловете?

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

Какво прави 'Restart=always', и има ли недостатъци?

То казва на systemd да рестартира услугата, когато излезе, по каквато и да е причина — ключът към държане на нещо работещо. Единствената уловка е crash loop: ако приложението се проваля мигновено при старт, systemd продължава да го рестартира. Добави 'RestartSec=5', за да разредиш опитите, и провери логовете, за да поправиш основната грешка.

Как да видя логовете на услугата?

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

Услугата трябва ли да работи като root?

По-добре не. Създай специален non-root потребител и задай 'User=' в unit-а, така че компрометиране на приложението да не предаде цялата машина. Пускай като root само когато услугата генуинно се нуждае от това.

Коментари

Още няма коментари. Бъди първият.

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

Коментарите се модерират преди да се появят.