systemd: пишем юнит для Python-сервиса
Зачем systemd
Запускать Python-скрипт через screen или nohup — плохая практика. systemd даёт автозапуск, перезапуск при падении, логирование через journald и управление зависимостями.
Минимальный юнит-файл
[Unit]
Description=My Python Service
After=network.target
[Service]
Type=simple
User=www-data
WorkingDirectory=/srv/myapp
ExecStart=/srv/myapp/venv/bin/python app.py
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
Сохраняем в /etc/systemd/system/myapp.service.
Управление
sudo systemctl daemon-reload
sudo systemctl enable myapp
sudo systemctl start myapp
sudo systemctl status myapp
Переменные окружения
Не хардкодь секреты в юнит-файле. Используй EnvironmentFile:
[Service]
EnvironmentFile=/etc/myapp/.env
ExecStart=/srv/myapp/venv/bin/python app.py
Логи
journalctl -u myapp -f # следить в реальном времени
journalctl -u myapp --since today
journalctl -u myapp -n 100
Restart политики
on-failure— перезапуск только при ненулевом коде выходаalways— перезапуск всегда, даже при systemctl stopon-abnormal— при сигналах и таймаутах
Для production используй on-failure с RestartSec=10 и StartLimitIntervalSec=60.