我有以下服务:
[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 上,由于输出缓冲区尚未满,输出可能不会显示。这就解释了为什么即使程序退出后也没有显示任何输出。