Запускать бота или бэкенд через nohup или screen ненадёжно: после перезагрузки или падения процесс сам не поднимется. systemd решает это штатно — описываете программу в unit-файле, и система следит за ней сама.
Управление службами
| Действие | Команда |
|---|---|
| Состояние и последние строки лога | systemctl status nginx |
| Запустить / остановить | systemctl start nginx / systemctl stop nginx |
| Перезапустить | systemctl restart nginx |
| Перечитать конфиг без остановки | systemctl reload nginx |
| Включить автозапуск и сразу запустить | systemctl enable --now nginx |
| Упавшие службы | systemctl --failed |
Напишите unit-файл
Пример для приложения, которое лежит в /opt/myapp и запускается от пользователя deploy:
[Unit]Description=My applicationAfter=network-online.targetWants=network-online.target[Service]Type=simpleUser=deployWorkingDirectory=/opt/myappEnvironmentFile=/opt/myapp/.envExecStart=/opt/myapp/bin/server --port 8080Restart=on-failureRestartSec=5[Install]WantedBy=multi-user.target- ExecStart — полный путь к программе. systemd не читает PATH из вашей оболочки.
- Restart=on-failure — перезапуск, если процесс завершился с ошибкой; RestartSec — пауза перед перезапуском в секундах.
- EnvironmentFile — переменные окружения из файла вида KEY=value. Держите его с правами 600.
- WantedBy=multi-user.target — служба стартует при обычной загрузке системы.
Запустите службу
$ systemctl daemon-reload$ systemctl enable --now myapp$ systemctl status myappИзменить чужую службу
Unit-файлы из пакетов перезаписываются при обновлении. Для правок используйте override — он хранится отдельно в /etc/systemd/system/<служба>.d/:
$ systemctl edit nginxВ открывшемся редакторе впишите только изменяемые параметры вместе с заголовком секции, например [Service] и строку LimitNOFILE=65535. systemctl edit сам перечитает конфигурацию; чтобы изменения вступили в силу, перезапустите службу.
Проверьте результат
$ systemctl is-enabled myapp$ journalctl -u myapp -n 50 --no-pagerДля верности перезагрузите сервер и убедитесь, что служба поднялась сама.
Частые ошибки
- status=203/EXEC — неверный путь в ExecStart или у файла нет права на исполнение.
- status=217/USER — пользователя из User= не существует.
- Служба «завершилась» сразу после старта при Type=simple — программа уходит в фон сама. Запускайте её в режиме foreground или используйте Type=forking.