У меня есть простая пользовательская служба 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
код, который вы написали. Чтобы решить эту проблему, вам нужно просмотреть код, который вы написали, или опубликовать код здесь с вопросом.