![Systemd python 服务即使使用 -u 也会缓冲 journalctl 输出](https://linux22.com/image/720919/Systemd%20python%20%E6%9C%8D%E5%8A%A1%E5%8D%B3%E4%BD%BF%E4%BD%BF%E7%94%A8%20-u%20%E4%B9%9F%E4%BC%9A%E7%BC%93%E5%86%B2%20journalctl%20%E8%BE%93%E5%87%BA.png)
我有一个简单的用户 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
您编写的代码中。要解决这个问题,您需要查看您编写的代码或在此处发布代码并提出问题。