Systemd python 服务即使使用 -u 也会缓冲 journalctl 输出

Systemd python 服务即使使用 -u 也会缓冲 journalctl 输出

我有一个简单的用户 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]”,并且我想要一个不涉及安装外部包的解决方案,这看似一个简单的任务。

还有其他方法可以删除这些缓冲区,以便将来自 python 的输出刷新到 journalctl 吗?

答案1

通过对 的实验unbuffer,您已经确定缓冲发生在您正在运行的命令中,而不是在 中systemd

因此缓冲发生在python您编写的代码中。要解决这个问题,您需要查看您编写的代码或在此处发布代码并提出问题。

相关内容