Journald 在程序退出失败之前不记录错误消息

Journald 在程序退出失败之前不记录错误消息

我正在使用 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

相关内容