Написали сервис, который должен работать 24/7 в Linux? Доверьте его автоматический перезапуск при «падении», автозагрузку и журналирование системе инициализации и управления службами systemd. Просто и надежно!
Введение
У меня написан Python-скрипт (interview_client.py), который должен запускаться при старте Linux системы, перезапускаться при «падении», работать 24/7, а сообщения от скрипта должны перенаправляться в журнал.
Код скрипта interview_client.py непринципиален для обсуждаемой в данной статье темы.
Systemd-сервис
Обернем Python-скрипт в systemd-сервис, чтобы systemd следил за Python-скриптом.
Создаем директорию для размещения пользовательских systemd-сервисов:
mkdir -p ~/.config/systemd/user/
Создаем файл interview_client.service:
touch ~/.config/systemd/user/interview_client.service
В файл добавляем следующий текст:
[Unit]
Description=Key Listener Client for interview
After=graphical-session.target
Requires=graphical-session.target
[Service]
Environment=DISPLAY=:0
ExecStart=/home/user/interview/venv/bin/python -u /home/user/interview/interview_client.py
Restart=always
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=default.target
У нас получился пользовательский systemd-сервис, который запускает Python-скрипт после запуска графической сессии, обеспечивает его перезапуск в случае сбоя и направляет логи в журнал journal.
Подробнее:
Description
— описание systemd-сервиса;After=graphical-session.target
— указываем, что systemd-сервис должен стартовать после запуска X-сессии (графической сессии);Requires=graphical-session.target
— указываем, что графическая сессия обязательна;Environment=DISPLAY=:0
— привязываемся к конкретной графической сессии;ExecStart
— указываем запускать Python-скрипт /home/user/interview/interview_client.py с помощью интерпретатора из виртуального окружения venv. В моем Python-скрипте есть зависимости, которые установлены не глобально, а в виртуальном окружении venv;-u
— запускаем Python в небуферизованном режиме (unbuffered). Это важно для логирования вывода в журнал;Restart=always
— указываем перезапускать Python-скрипт всегда;StandardOutput=journal
иStandardError=journal
— направляем весь stdout и stderr, включая print() и traceback, в журнал journal;WantedBy
— указываем, что systemd-сервис должен автоматически запускаться при старте системы в пользовательской граффической сессии.
Перезапускаем systemd, чтобы он прочитал новый файл interview_client.service в пользовательском контексте:
systemctl --user daemon-reload
Добавляем systemd-сервис interview_client.service в автозагрузку:
systemctl --user enable interview_client.service
Немедленно запускаем systemd-сервис interview_client.service:
systemctl --user start interview_client.service
Проверяем статус:
systemctl --user status interview_client.service
Если понадобится остановить systemd-сервис interview_client.service:
systemctl --user stop interview_client.service
Если понадобится удалить из автозагрузки:
systemctl --user disable interview_client.service
Логи systemd-сервиса
Посмотреть лог сервиса:
journalctl --user -u interview_client.service
Смотреть лог сервиса в реальном времени:
journalctl --user -u interview_client.service -f
Проверка размера журнала:
journalctl --user --disk-usage
У меня:
Archived and active journals take up 127.9M in the file system.
Ограничим размер журнала. Для этого отредактируем конфигурационный файл /etc/systemd/journald.conf. Следующие параметры приводим к виду:
SystemMaxUse=100M
SystemKeepFree=50M
SystemMaxFileSize=20M
SystemMaxFiles=10
Применяем изменения:
systemctl restart systemd-journald
Преимущества systemd-сервиса
Вот список преимуществ использования systemd-сервиса с самописным приложением:
- Удобные команды ручного запуска, остановки и контроля systemd-сервиса (systemctl start|stop|status|…).
- Настройка автозапуска приложения при загрузке системы.
- Настройка автоматического перезапуска при сбое приложения.
- Настройка зависимостей для запуска приложения в нужном порядке.
- Журналирование.
- Настройка ограничений используемых ресурсов (CPU, памяти и др.).
- Настройка прав доступа к ресурсам (сети, файловой системе и др.).
- Простой формат файлов .service.
- Поддержка шаблонов и инстансов для многократного запуска systemd-сервиса с разными параметрами.
Выводы
Systemd — это удобно: написали и отладили скрипт, остальное systemd берет на себя.
Все обсуждение статьи в комментариях ниже!
Комментарии