3

私はこれを持っています:

 ping -q xxx.xxx.xxx.xxx & disown; pingpid=$!
 for run in {1..3}; do
 sleep 5
 stats+=$(kill -SIGQUIT $pingpid)
 done
 kill $pingpid

したがって、基本的には -q オプションを使用してバックグラウンドで ping を起動し (統計のみを表示するため)、その PID を取得してforから、ping の中間統計をkill -SIGQUIT $pingpid変数に格納するループを実行します...これは 3 行の統計です、5秒間隔。

中間統計が stdout に出力されているのを確認できますが、$stats変数を確認すると、変数が空であることがわかります。また、stderr を stdout にリダイレクトしようとしましたが、変数に統計を格納することはまだできません。

4

2 に答える 2

2

キャプチャしようとしている出力は、kill プロセスではなく、ping プロセス (正確には標準エラー) からのものです。起動時にリダイレクトを使用して出力をキャプチャする必要があります。これを試して:

stats=""
{
        read pingpid
        for run in {1..3}; do
                sleep 5
                kill -quit $pingpid
                read line
                stats+="$line"$'\n'
        done
} < <(ping -q xx.xx.xx.xx 2>&1 >/dev/null & echo $!)

kill $pingpid
stats=${stats%$'\n'}  # Remove the extra newline
echo "$stats"

pingコマンドのリダイレクトの順序は、2>&1 >/dev/null標準出力を に/dev/nullリダイレクトし、標準エラーはループの入力にリダイレクトします。

于 2015-03-06T14:03:44.260 に答える
1

ここで実際に何を達成しようとしていますか?実際には、タイムアウトまたは限られた数のパケットで実行する必要があるようですping(最終的には同じことになります)。

for run in 1 2 3; do
    ping -c 5 -q 12.34.56.78 | tail -n 2
done

からの通常の出力pingは、SIGQUIT を送信したときに得られる 1 行よりもやや冗長なので、2 行の出力が必要です。おそらく、単純な Awk スクリプトにパイプして出力を正規化し、ニーズに合わせたり、適切に機械で読み取り可能な形式に変換したりしたいでしょう。

于 2015-03-09T08:55:57.913 に答える