为什么带有管道输出的 systemd 用户服务没有显示在日志日志中

为什么带有管道输出的 systemd 用户服务没有显示在日志日志中

我有以下服务:

[Unit]
Description="Hoping to get rich"

[Service]
ExecStart='/home/me/Dev/hellogoogle.sh'
Restart=on-failure
RestartSec=5s

[Install]
WantedBy=default.target

正如您所看到的,这是一个执行 shell 脚本的非常简单的服务。 shell脚本如下:

#!/usr/bin/sh

echo "Here we go"
ping google.com | grep '.'
echo "And we're rich"

当我使用上面的脚本启动服务时,我得到的唯一输出是Here we go.但是,如果我删除 ie,| grep '.'我不会通过管道传输输出,该服务会显示 echo 命令显示的内容。

这就是我监控输出的方式(使用journald):

journalctl --follow --user-unit=hello-google.service

有人可以帮助我了解这里发生了什么吗?为什么 systemd 不显示 shell 脚本的任何输出,只是因为该脚本将其部分输出传输到另一个命令?

请注意,这是作为用户服务,而不是系统。

答案1

好吧,所以我又费了一番功夫,看起来问题只是grep缓冲了它的输出,然后即使在命令结束后也不显示它......仍然不确定为什么会出现这种情况。

解决方案?

ping google.com | grep --line-buffered '.'

或者

ping google.com | stdbuf --output=L grep '.'

根据这个回答在 SO 上,由于输出缓冲区尚未满,输出可能不会显示。这就解释了为什么即使程序退出后也没有显示任何输出。

相关内容