Bash:将关于SIGQUIT的ping的中间统计信息捕获到变量

时间:2015-03-06 12:19:34

标签: bash ping sigkill output-redirect

我有这个:

 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循环,其中我想在每个{{1上存储ping的中间统计信息在一个变量......那3行统计数据,相隔5秒。

我可以看到中间数据被打印到stdout但是当我检查kill -SIGQUIT $pingpid变量时,我发现它是空的。我也尝试使用stderr重定向到stdout,但我仍然无法获取变量以将统计信息存储在其中。

2 个答案:

答案 0 :(得分:2)

您尝试捕获的输出来自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,同时将标准错误重定向到循环的输入。

答案 1 :(得分:1)

你到底想要在这里完成什么?看起来你实际上应该使用超时或有限数量的数据包运行ping(最终相同的数量)。

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

来自ping的常规输出比发送SIGQUIT时获得的单行更冗长,因此我们需要两行输出。也许您想要通过一些简单的Awk脚本来规范化输出以使其符合您的需求,或者将其转换为适当的机器可读格式。