Запуск приложения через & или 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 # убрать из автозапуска
Честные предостережения
- Выполняйте
daemon-reloadпосле правки unit-файла, иначе systemd использует старую версию. - Следите за циклами падений. Если приложение падает мгновенно,
Restart=alwaysбудет повторять вечно —RestartSec=5разносит попытки; устраните первопричину по логам. - Предпочитайте
User=без прав root, чтобы скомпрометированное приложение не владело всем сервером.
Что дальше
systemd-сервис — это то, как вы держите что угодно запущенным 24/7 — например ИИ-агента, работающего круглосуточно или ретранслятор за собственным сервером RustDesk. Если ваше приложение вместо этого в контейнере, ту же роль играет --restart unless-stopped у Docker — см. как установить Docker.
Комментарии
Пока нет комментариев. Будьте первым.