我正在尝试编写一个小脚本,用ping来跟踪网络延迟。
我需要写一个文件并用日期和时间标记每个ping条目。我需要实时查看响应并在ping时间过长时停止脚本。
我可以在没有日期的代码中获取ping结果和摘要,代码如下
acm-siggraph.csl
stdout结果
#!/usr/bin/env bash
echo "Enter Dealer number: "
read deal
echo "Enter IP address: "
read ip
touch ./${deal}_pingtest.txt
ping $ip > ./${deal}_pingtest.txt &
tail -f ./${deal}_pingtest.txt
档案结果
Enter Dealer number:
test
Enter IP address:
8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=58 time=4.87 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=58 time=5.36 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=58 time=8.30 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=58 time=4.48 ms
^C
当我将日期添加到脚本时,文件结果永远不会显示统计信息 带时间戳的脚本
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=58 time=4.87 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=58 time=5.36 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=58 time=8.30 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=58 time=4.48 ms
--- 8.8.8.8 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 2999ms
rtt min/avg/max/mdev = 4.488/5.758/8.309/1.506 ms
stdout结果
#!/usr/bin/env bash
echo "Enter Dealer number: "
read deal
echo "Enter IP address: "
read ip
touch ./${deal}_pingtest.txt
ping $ip | while read pong; do echo "$(date +%Y-%m-%d\|%H:%M:%S): $pong"; done > ./${deal}_pingtest.txt &
tail -f ./${deal}_pingtest.txt
档案结果
Enter Dealer number:
test
Enter IP address:
8.8.8.8
2017-08-04|11:31:29: PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
2017-08-04|11:31:29: 64 bytes from 8.8.8.8: icmp_seq=1 ttl=58 time=4.71 ms
2017-08-04|11:31:30: 64 bytes from 8.8.8.8: icmp_seq=2 ttl=58 time=4.53 ms
2017-08-04|11:31:31: 64 bytes from 8.8.8.8: icmp_seq=3 ttl=58 time=4.85 ms
2017-08-04|11:31:32: 64 bytes from 8.8.8.8: icmp_seq=4 ttl=58 time=5.11 ms
2017-08-04|11:31:33: 64 bytes from 8.8.8.8: icmp_seq=5 ttl=58 time=4.51 ms
^C
谢谢大家的指导。
答案 0 :(得分:2)
ping
只会在SIGINT
或SIGQUIT
被杀的情况下显示统计信息(或者如果达到-c count
定义的ping数量,则会显示统计信息,但您还是不使用那个)。来自man ping
:
当已发送(和接收)指定数量的数据包或程序以SIGINT终止时,将显示简要摘要。通过信号SIGQUIT可以在不终止过程的情况下获得更短的电流统计数据。
所以,如果你想要打印统计数据,请务必像这样杀死ping
:
pkill ping -SIGINT
答案 1 :(得分:2)
我假设您在键盘上使用ctrl-C
来中断此脚本。您需要对事物进行编码以便ping
命令被中断并发出其摘要信息,但捕获ping
输出的shell仍然可以捕获该摘要并将其发送到输出文件。
这似乎是trap
内置到bash
的工作。
调整原始脚本:
#!/usr/bin/env bash
read -p "Enter Dealer number: " deal
read -p "Enter IP address: " ip
trap INT
ping $ip | while read pong; do echo "$(date +%Y-%m-%d\|%H:%M:%S): $pong"; done > "$deal"_pingtest.txt &
tail -f "$deal"_pingtest.txt
来自bash
手册页的 SIGNALS 部分: bash运行的非内置命令将信号处理程序设置为shell从其父级继承的值。
上面的trap
命令意味着运行while循环的shell不会响应键盘中断(信号INT
),但非内置ping
命令将具有其处置bash
启动时会重置为默认值,因此键盘信号会中断 。 ping
然后发出它的摘要并退出,并且shell可以存活以捕获所有输出。
您还可以构建一些内容,以便您不必依赖后台进程/ tail
组合:
#!/usr/bin/env bash
read -p 'Enter Dealer number: ' deal
read -p 'Enter IP address: ' ip
trap '' INT
ping "$ip" |
while read pong; do
echo "$(date '+%Y-%m-%d|%H:%M:%S'): $pong"
done | tee "$deal"_pingtest.txt
请注意,我使用read
内置及其 -p 选项来提示输入。