Mar*_*erg 5 systemd systemd-journald
我有一个登录到标准输出的 systemd 服务。从那里,systemd 捕获 STDOUT 并将其写入日志。
我使用一个常见的习惯用法来处理错误,在那里我进行了echo一些诊断,然后以非零错误代码退出:
echo "my final error";
exit 1;
Run Code Online (Sandbox Code Playgroud)
我的问题是这最后echo一行进入了日志,但与我的“单位”没有正确关联。通过查看journalctl -o json-pretty,我可以看到有什么不同。最后的日志记录缺少 _SYSTEMD_CGROUP 和 _SYSTEMD_UNIT 属性。
我认为正在发生的是一种竞争条件。我怀疑 bash 脚本journald在进入退出行之前没有等待完全处理。因此exit在journald完成处理日志条目之前到达该行。journald尝试查找unit发送日志的 ,但现在无法找到它,因为该单元不再运行。
如果我是对的,我可能可以通过sleep 1在我的exit 1声明之前放置来解决这个问题,但是有没有更好的方法来获得最终日志属性的属性?
我systemd在 Ubuntu 16.04 上使用版本 229。
@mark-stosberg,这是一个已知问题:由于 /proc 与 SCM_CREDS 竞争,journald 无法将从退出到其 cgroup 的进程传入的消息归因于
您可以在那里找到解决方法:https://github.com/systemd/systemd/issues/2913#issuecomment-219702148
将进程名称设置为发送到日志系统或内核日志缓冲区的日志行的前缀。
并运行
journalctl _SYSTEMD_UNIT=unit + UNIT=unit + SYSLOG_IDENTIFIER=id
| 归档时间: |
|
| 查看次数: |
725 次 |
| 最近记录: |