Вопрос или проблема
Я написал простой скрипт на 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.
Шаги для реализации
- Модификация Python-скрипта
Ваш скрипт, работающий в бесконечном цикле, должен выводить информацию в журнал. В данном случае вы уже выводите строку в стандартный вывод, так что изменений здесь не требуется.
#!/bin/python3
while True:
print('True')
- Изменение 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
задает тег для ваших логов. Это поможет вам фильтровать и находить ваши записи в журнале.
- Перезапуск службы
После внесения изменений не забудьте перезапустить вашу службу и обновить системный кеш unit-файлов:
sudo systemctl daemon-reload
sudo systemctl restart true-service
Проверка логов
Теперь, чтобы увидеть вывод из вашего Python-скрипта, используйте следующие команды:
journalctl -t true-service
Эта команда выведет все сообщения, которые были записаны в журнал с тегом true-service
.
Заключение
При правильной конфигурации systemd
и systemd-cat
, вы сможете легко управлять логированием ваших Python-скриптов, что упростит отладку и администрирование. Убедитесь, что все пути к исполняемым файлам указаны корректно, и ваш скрипт будет стабильно выводить информацию в системный журнал.