![Journald 在程序退出失败之前不记录错误消息](https://linux22.com/image/714350/Journald%20%E5%9C%A8%E7%A8%8B%E5%BA%8F%E9%80%80%E5%87%BA%E5%A4%B1%E8%B4%A5%E4%B9%8B%E5%89%8D%E4%B8%8D%E8%AE%B0%E5%BD%95%E9%94%99%E8%AF%AF%E6%B6%88%E6%81%AF.png)
我正在使用 debian stretch 上的 systemd(版本:systemd 232)调用 python3 模块。问题是,如果 python 模块引发异常,则在模块因失败退出之前,异常消息(stderr)和一些先前的打印(stdout)不会输出到日志中。
服务配置如下:
[Unit]
Description=Some Service
After=network.target
StartLimitIntervalSec=3
StartLimitBurst=2
[Service]
User=foo
PermissionsStartOnly=true
ExecStartPre=-/bin/mkdir -p /var/run/foo
ExecStartPre=/bin/chown user:user /var/run/foo/
Type=simple
PIDFile=/var/run/foo/foo.pid
ExecStart=/usr/local/bin/foo_continual
Restart=always
RestartPreventExitStatus=0
RestartSec=2
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
foo_continual
是一个 bash 脚本,用于设置 python 虚拟环境,然后运行 python 模块:
#!/bin/bash
source /home/foo/environment/bin/activate || exit 1
python -u -m foo.main || exit 1
该脚本包含一些print()
调用。我甚至flush=True
对其中一个进行了测试,它包含一个异常,该异常应打印到 stderr 并导致程序以非 0 退出代码退出。问题是 journald 日志不包含完整输出,包括错误消息:
Dec 01 18:32:07 TESTING systemd[1]: foo.service: Service hold-off time over, scheduling restart.
Dec 01 18:32:07 TESTING systemd[1]: Stopped Some Service.
Dec 01 18:32:07 TESTING systemd[1]: Started Some Service.
Dec 01 18:32:08 TESTING foo_continual[50903]: Print some stuff...
Dec 01 18:32:08 TESTING systemd[1]: foo.service: Main process exited, code=exited, status=1/FAILURE
Dec 01 18:32:08 TESTING systemd[1]: foo.service: Unit entered failed state.
Dec 01 18:32:08 TESTING systemd[1]: foo.service: Failed with result 'exit-code'.
Dec 01 18:32:10 TESTING systemd[1]: foo.service: Service hold-off time over, scheduling restart.
Dec 01 18:32:10 TESTING systemd[1]: Stopped Some Service.
Dec 01 18:32:10 TESTING systemd[1]: Started Some Service.
Dec 01 18:32:10 TESTING systemd[1]: foo.service: Main process exited, code=exited, status=1/FAILURE
它应该打印更多文本,包括“打印一些内容”之后的 stderr 错误。我怎样才能让 jorunald 在程序退出之前记录所有输出?
答案1
我发现的唯一解决方案不是很好,但它确实有效。在 bash 文件中,退出前休眠,让 journald 有机会记录输出:
#!/bin/bash
function fail {
sleep 2
exit 1
}
source /home/foo/environment/bin/activate || fail
python -u -m foo.main || fail