我要问您一个理论性的问题。
在终端中运行进程时,我经常只关心最近的最后一行。我想从另一个程序调用该行中的数据。
假设我想构建一个类似 ping 服务器的东西。这个 ping 服务器会将最新的 ping 行写入文本文件。而且这个文件可以毫无损坏地读取。
首先我会做一些简单的事情
ping 8.8.8.8 > ping.txt
但这会将每一行都写入文件。我只想要一个包含最新 ping 的文件。
现在,如果我到了这个地步。我有时会遇到读取文件的问题,因为它也在被写入。我该如何避免这个问题?
答案1
以下是对您的“理论”问题的一些实际答案。
tail
可以为你做这件事
例子:
ping -c 10 8.8.8.8 | tail --lines=3 > output.file
ping 命令中的 -c 10 开关将 ping 次数限制为 10 次,而不是默认的无限期地继续。tail 命令中的 lines=3 开关将输出限制为最后 3 行,这通常是我们真正关心的。
这将仅产生摘要(最后 3 行),如下所示:
--- 8.8.8.8 ping statistics ---
10 packets transmitted, 10 received, 0% packet loss, time 9014ms
rtt min/avg/max/mdev = 22.810/25.120/31.137/2.936 ms
如果出于某些奇怪的原因,你确实想要单个 ping 的输出,只需将上述内容修改为ping -c 1 8.8.8.8 | head --lines=2 | tail --lines=1 > output.file
导致:
64 bytes from 8.8.8.8: icmp_seq=1 ttl=45 time=24.0 ms
编辑:连续单次 ping 按照评论的要求:
while :; do ping -c 1 8.8.8.8>output.file; sleep 1; done
由于 while : 的计算结果始终为真,因此这将无限循环,运行 ping 并将输出重定向到 output.file,每次循环运行时都会覆盖它。每次迭代都会暂停一秒钟,以便您有时间读取输出。
您可以尝试低于一秒的睡眠值,例如 0.5 或 0.01,但在某些时候,写入之间的延迟会太短,并且会回到开始的地方。
资料来源:
man ping
man tail
经验