systemd и логирование Python

Вопрос или проблема

Я написал простой скрипт на python3 и хочу сделать из него сервис. Вот два файла

#!/bin/python3
while True:
     print('True')

Система сервиса Systemd:

[Unit]
Description=True Service

[Service]
Type=simple
ExecStart=python3 /root/print_true.py
StandardOutput=journal+console

[Install]
WantedBy=multi-user.target

Сервис запускается, но я не вижу вывод ни в journalctl -u true-service.service, ни в systemctl status true-service, ни в syslog. Я хочу, чтобы он был только в журнале, но как я могу этого достичь? Я не могу найти рабочий ответ.

Используйте systemd-cat, чтобы достичь этого, передайте вывод в него.

Проверьте это:

echo "hello world" | systemd-cat -ttrue-service

Просмотрите вывод:

journalctl -t true-service

Измените ваш юнит сервиса:

ExecStart=/usr/bin/python3 /root/print_true.py | /usr/bin/systemd-cat -ttrue-service

Ответ или решение

Система логирования Python в контексте systemd: Полное руководство

В современных операционных системах на базе Linux использование systemd в качестве инициализирующего процесса стало стандартом. Оно не только управляет сервисами, но и включает в себя механизмы для логирования, что делает его мощным инструментом для администраторов и разработчиков. В этом материале мы рассмотрим, как правильно настроить логирование для Python-скриптов, работающих как службы systemd.

Проблема с выводом

Ваша проблема заключается в отсутствии видимого вывода из вашего Python-скрипта при работе службы. Учитывая, что вы хотите видеть вывод только в журнале systemd, стоит понимать, что стандартный вывод из процессов, запущенных в systemd, обрабатывается несколько иначе, чем в обычной консоли.

Ваш скрипт выводит "True" в бесконечном цикле, однако, при запуске его как службы, вывод невозможно увидеть без специальных настроек.

Решение

Для достижения желаемого результата воспользуемся утилитой systemd-cat. Она предоставляет возможность перенаправлять стандартный вывод и стандартный поток ошибок вашего приложения в системный журнал systemd.

Шаги для реализации

  1. Модификация Python-скрипта

Ваш скрипт, работающий в бесконечном цикле, должен выводить информацию в журнал. В данном случае вы уже выводите строку в стандартный вывод, так что изменений здесь не требуется.

#!/bin/python3
while True:
    print('True')
  1. Изменение unit-файла systemd

В вашем unit-файле службы systemd необходимо внести изменения в строку ExecStart, добавив systemd-cat для перенаправления вывода. Измененная версия будет выглядеть следующим образом:

[Unit]
Description=True Service

[Service]
Type=simple
ExecStart=/usr/bin/python3 /root/print_true.py | /usr/bin/systemd-cat -t true-service

[Install]
WantedBy=multi-user.target

Обратите внимание, что мы добавили | /usr/bin/systemd-cat -t true-service, где -t задает тег для ваших логов. Это поможет вам фильтровать и находить ваши записи в журнале.

  1. Перезапуск службы

После внесения изменений не забудьте перезапустить вашу службу и обновить системный кеш unit-файлов:

sudo systemctl daemon-reload
sudo systemctl restart true-service

Проверка логов

Теперь, чтобы увидеть вывод из вашего Python-скрипта, используйте следующие команды:

journalctl -t true-service

Эта команда выведет все сообщения, которые были записаны в журнал с тегом true-service.

Заключение

При правильной конфигурации systemd и systemd-cat, вы сможете легко управлять логированием ваших Python-скриптов, что упростит отладку и администрирование. Убедитесь, что все пути к исполняемым файлам указаны корректно, и ваш скрипт будет стабильно выводить информацию в системный журнал.

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

Капча загружается...