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

标签 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 循环,我想在其中存储每个 ping 的中间统计信息kill -SIGQUIT $pingpid 在一个变量中...这是 3 行统计数据,相隔 5 秒。

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

最佳答案

您 try catch 的输出来自 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 而标准错误被重定向到循环的输入。

关于Bash:将 ping 对 SIGQUIT 的中间统计信息捕获到变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28898666/

相关文章:

java - 如何获取发送和接收 ping 请求的时间间隔

linux - SIGKILL 信号处理

linux - 使用反引号时如何抑制命令输出?

bash - 有没有办法将命令行输出 'inject' 转换为另一个命令?

javascript - jQuery Ajax 停止长轮询

java - 运行 SpringBootApplication PostConstruct 和 PreDestroy

iphone - 在 glDrawArrays() 上调试 SIGKILL。苹果手机

linux - 如何从命令输出中删除空格/制表符

linux - 如何在 Linux 中从文件创建裸压缩流?

java - Android java/system/bin/ping 总是返回exitCode 2,为什么?