Linux shell - 将 ping 输出到文件并仅保留最后 X 行

问题描述 投票:0回答:1

我想为我的 Raspberry Pi 编写一个 shell 脚本来永久 ping 特定主机,但只将最后 20 个结果保留在文本文件中。

所以我的想法是将 ping 输出重定向到一个文本文件,并编写一个循环来重复将所述文件限制为 20 行:

ping ServerX.domain.com -i 5 -D 1>/home/user/Desktop/Ping.txt &
while :
do
    tail /home/user/Desktop/Ping.txt -n 20 >/home/user/Desktop/Ping.txt
done

这会以某种方式完全删除 Ping.txt 的文件内容吗?所以我必须将内容重定向到一个变量,然后将其重写到文件中:

ping ServerX.domain.com -i 5 -D >/home/user/Desktop/Ping.txt &
while :
do
    PingContent=$(tail /home/user/Desktop/Ping.txt -n 20)
    echo "$PingContent" >/home/user/Desktop/Ping.txt
    sleep 4
done

这似乎工作得很好,但是时不时地在我的文件的最后一行中出现一些不可读的空字符。我猜当两个命令尝试同时写入 Ping.txt 时就会发生这种情况。我怎样才能避免这种情况?

linux shell ping tail
1个回答
0
投票

所以问题是重定向

>
在开始将内容拖入目标文件之前会清除目标文件。当它完成时,文件已经被清除。 来源:https://serverfault.com/questions/1101628/why-tail-to-same-file-create-a-empty-file-or-empty-the-file

这是我的实现方式,您可以如何实现结果(根据需要进行调整):

#!/bin/bash

ping 127.0.0.1 -i 2 -D | while read pong; do 
    echo "$(tail -5 /tmp/pinglog.log)" > /tmp/pinglog.log
    echo "$(date):$pong" >> /tmp/pinglog.log  
done;

这里 echo 中的评估似乎有点像缓冲区。

© www.soinside.com 2019 - 2024. All rights reserved.