![为什么带有管道输出的 systemd 用户服务没有显示在日志日志中](https://linux22.com/image/185870/%E4%B8%BA%E4%BB%80%E4%B9%88%E5%B8%A6%E6%9C%89%E7%AE%A1%E9%81%93%E8%BE%93%E5%87%BA%E7%9A%84%20systemd%20%E7%94%A8%E6%88%B7%E6%9C%8D%E5%8A%A1%E6%B2%A1%E6%9C%89%E6%98%BE%E7%A4%BA%E5%9C%A8%E6%97%A5%E5%BF%97%E6%97%A5%E5%BF%97%E4%B8%AD.png)
我有以下服务:
[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 上,由于输出缓冲区尚未满,输出可能不会显示。这就解释了为什么即使程序退出后也没有显示任何输出。