Назад | Перейти на главную страницу

Systemd python буферизует вывод journalctl даже с -u

У меня есть простая пользовательская служба systemd, настроенная так:

[Unit]
Description=Bot
AssertPathExists=/home/mikel/discord-bot/

[Service]
WorkingDirectory=/home/mikel/discord-bot/
ExecStart=/home/mikel/anaconda3/bin/python -u bot.py parameters.json
Restart=always
RestartSec=3

[Install]
WantedBy=default.target

По сути, все, что делает служба, - это запускает скрипт Python.

Однако когда я смотрю на journalctl Что касается службы, я вижу, что вместо того, чтобы появляться в журналах по мере того, как что-то происходит в сценарии, все они сразу сбрасываются при остановке службы (с одинаковой меткой времени для каждой строки).

Это говорит о том, что где-то возник какой-то буфер, который не позволяет немедленно записать его в journalctl. Однако даже когда я выключаю внутренний буфер Python с помощью -u, проблема все еще возникает.

Я нашел одно решение - обернуть его в unbuffer команда из expect пакет, вот так:

ExecStart=/usr/bin/unbuffer /home/mikel/anaconda3/bin/python -u bot.py parameters.json

Однако, хотя это работает, это означает, что journalctl показывает «unbuffer [PID]» вместо «python [PID]», и мне нужно решение, которое не требует установки внешних пакетов для того, что кажется простой задачей.

Есть ли другой способ удалить эти буферы, чтобы вывод сбрасывался в journalctl, поскольку он поступает из python?

Через ваш эксперимент с unbuffer, вы установили, что буферизация выполняется в выполняемой вами команде, а не в systemd.

Таким образом, буферизация происходит в python код, который вы написали. Чтобы решить эту проблему, вам нужно просмотреть код, который вы написали, или опубликовать код здесь с вопросом.