Написали сервис, который должен работать 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-сервиса с самописным приложением:

  1. Удобные команды ручного запуска, остановки и контроля systemd-сервиса (systemctl start|stop|status|…).
  2. Настройка автозапуска приложения при загрузке системы.
  3. Настройка автоматического перезапуска при сбое приложения.
  4. Настройка зависимостей для запуска приложения в нужном порядке.
  5. Журналирование.
  6. Настройка ограничений используемых ресурсов (CPU, памяти и др.).
  7. Настройка прав доступа к ресурсам (сети, файловой системе и др.).
  8. Простой формат файлов .service.
  9. Поддержка шаблонов и инстансов для многократного запуска systemd-сервиса с разными параметрами.

Выводы

Systemd — это удобно: написали и отладили скрипт, остальное systemd берет на себя.

Все обсуждение статьи в комментариях ниже!

Комментарии

Добавить комментарий

Этот сайт защищен reCAPTCHA, и к нему применяются Google Политика конфиденциальности и Условия использования.

Войти

Зарегистрироваться

Сбросить пароль

Пожалуйста, введите ваше имя пользователя или эл. адрес, вы получите письмо со ссылкой для сброса пароля.