我创建了一个程序,故意产生被零除错误。
如果我在命令行中运行它,它将返回:“浮点异常”
但如果我将其作为systemd
服务运行,我就看不到此错误消息。
在我的systemd
脚本中我添加了:
StandardError=journal
但使用时却看不到错误信息journalctl
。如何将此错误消息添加到使用 看到的日志中journalctl
?
答案1
要使用以下命令获取运行服务的所有错误journalctl
:
$ journalctl -p 3 -xb
其中-p 3
means priority err
,-x
提供额外的消息信息,并-b
表示自上次启动以来
答案2
默认情况下,systemd 单元的 stdout 和 stderr 会发送到 syslog。因此您可以在文件/var/log/messages
或/var/log/dmesg
.
要更改它,您可以使用以下命令:
sudo journalctl -u [yourunit]
其中 [yourunit] 是 systemd .service 名称。例如,要查看来自 yourapp.service 的消息,
sudo journalctl --unit=yourapp
然后使用命令重新启动journalctl
sudo systemctl restart systemd-journald
如果这对您不起作用,请将StandardOutput=syslog+console
和添加StandardError=syslog+console
到您的 systemd 脚本中并重新启动 systemctl。之后,您可以使用journalctl 访问设备的输出。
答案3
正如 JdeBP 试图暗示的那样,当您从 shell 运行程序并且它被信号 SIGFPE 杀死时,特定消息“浮点异常”将由您打印壳。从技术上讲你的程序可以如果你这样写的话,捕获信号并打印错误 - 但这对于 SIGKILL 不起作用。
你需要一些父进程使用wait()
或类似的方法来读取程序的退出状态并记录它。服务经理systemd
就是这样的家长。它的信息看起来并不相同,但它应该当您查看日志中的服务日志时,会有类似的内容。可能会提到SIGFPE
。
此外,如果您已systemd-coredump
启用,它应该会记录 的崩溃消息SIGFPE
,因为此信号的默认操作是生成核心转储。这些崩溃消息应该被标记,以便它们在查询服务的消息时显示。我喜欢systemd-coredump
并确保在我的 Debian 系统上启用它,尽管目前安装它会删除 Ubuntu 上的崩溃报告程序 Apport。在开发时,有些人可能更喜欢直接处理核心文件而不是使用systemd-coredump
,尽管核心转储不会弄乱您的目录是件好事,而且它们会在一段时间后被清理(释放磁盘空间)。