パイプ出力を使用するシステムユーザーサービスがログログに表示されない理由

パイプ出力を使用するシステムユーザーサービスがログログに表示されない理由

私は次のサービスを持っています:

[Unit]
Description="Hoping to get rich"

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

[Install]
WantedBy=default.target

ご覧のとおり、これはシェルスクリプトを実行する非常にシンプルなサービスです。シェルスクリプトは次のとおりです。

#!/usr/bin/sh

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

上記のスクリプトを使用してサービスを開始すると、私が得る唯一の出力はですHere we go。ただし、IEを削除すると| grep '.'出力がパイプされず、サービスはechoコマンドによって表示される内容を表示します。

これはジャーナルドを使用して出力を監視する方法です。

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

ここで何が起こっているのかを理解するのに役立つ人はいますか?スクリプトが出力の一部を別のコマンドにパイプするため、systemdがシェルスクリプトの出力を表示しないのはなぜですか?

だから参考にしてくださいユーザーシステムではなくサービス。

答え1

さて、もう少し調べてみると、grep出力をバッファリングしてからコマンドが終わった後も表示しないのが問題のようです。それでもなぜこれが起こるのかわかりません。

解決策?

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

または

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

これによると回答SO では、出力バッファがまだいっぱいになっていないため、出力が表示されないことがあります。これは、プログラムが終了した後に出力が表示されない理由を説明します。

関連情報