Bash: 捕获ping对SIGQUIT的中介统计到变量

Bash: capture ping's intermediary statistics on SIGQUIT to variable

我有这个:

 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 循环,在这个循环中我想在每个 kill -SIGQUIT $pingpid 在变量中...这是 3 行统计数据,相隔 5 秒。

我可以看到中间统计数据正在打印到标准输出,但是当我检查 $stats 变量时,我发现它是空的。我也尝试将 stderr 重定向到 stdout,但我仍然无法获取变量以将统计信息存储在其中。

您尝试捕获的输出来自 ping 进程(准确地说是标准错误),而不是 kill 进程。启动它时,您需要通过重定向捕获其输出。试试这个:

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,而标准错误将重定向到循环的输入。

你到底想在这里完成什么?看起来你实际上应该 运行 ping 超时,或者限制数量的数据包(最终是一样的)。

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

ping 的常规输出比您向它发送 SIGQUIT 时得到的单行输出要冗长一些,因此我们需要两行输出。也许您想通过管道传输到一些简单的 Awk 脚本以规范化输出以使其满足您的需要,或者可能将其转换为正确的机器可读格式。