Bash:将 SIGQUIT 上的 ping 中介统计数据捕获到变量

问题描述 投票:0回答:2

我有这个:

 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
上 ping 的中间统计信息存储在变量中。 ..这是 3 行统计数据,间隔 5 秒。

我可以看到中间统计信息被打印到标准输出,但是当我检查

$stats
变量时,我发现它是空的。我还尝试使用 stderr 重定向到 stdout,但我仍然无法让变量将统计信息存储在其中。

bash ping sigkill output-redirect
2个回答
3
投票

您尝试捕获的输出来自

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
投票

您实际上想在这里完成什么? 看起来你实际上应该运行

ping
并设置超时或有限数量的数据包(最终达到相同的效果)。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.