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 秒。

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

4

2 回答 2

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

于 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 时得到的单行要详细一些,因此我们需要两行输出。也许您想通过管道传输到一些简单的 Awk 脚本以规范化输出以使其适合您的需要,或者可能将其转换为适当的机器可读格式。

于 2015-03-09T08:55:57.913 回答