我想为我的 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 时就会发生这种情况。我怎样才能避免这种情况?
所以问题是重定向
>
在开始将内容拖入目标文件之前会清除目标文件。当它完成时,文件已经被清除。
来源: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 中的评估似乎有点像缓冲区。