如何将进程的最新一行写入可读文件

如何将进程的最新一行写入可读文件

我要问您一个理论性的问题。

在终端中运行进程时,我经常只关心最近的最后一行。我想从另一个程序调用该行中的数据。

假设我想构建一个类似 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

经验

https://www.cyberciti.biz/faq/bash-infinite-loop/

http://www.linuxforums.org/forum/programming-scripting/70966-possible-sleep-less-than-1-sec-simple-bash-script.html

相关内容