gpt4 book ai didi

linux - ping 摘要未在 bash 脚本中显示日期

转载 作者:可可西里 更新时间:2023-11-01 11:51:54 25 4
gpt4 key购买 nike

我正在尝试编写一个小脚本来使用 ping 跟踪网络延迟。

我需要写入一个文件并用日期和时间标记每个 ping 条目。我需要实时查看响应并在 ping 时间太长时停止脚本。

我可以在没有日期的文件中获取 ping 结果和摘要,代码如下

#!/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

当我将日期添加到脚本时,文件结果从不显示统计信息带时间戳的脚本

#!/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

文件结果

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
2017-08-04|11:31:34: 64 bytes from 8.8.8.8: icmp_seq=6 ttl=58 time=4.89 ms

谢谢大家的指导。

最佳答案

我假设您在键盘上使用 ctrl-C 来中断此脚本。您需要编写代码以便 ping 命令被中断并发出其摘要信息,但是捕获 ping 输出的 shell 仍然存在以捕获该摘要并将其发送到输出文件。

这似乎是 bash 内置的 trap 的工作。

调整您的原始脚本:

#!/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 从它的 parent 。

上面的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 选项来提示输入。

关于linux - ping 摘要未在 bash 脚本中显示日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45513466/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com