我需要一个创建脚本的解决方案,以便在达到特定大小后重新创建(使用相同名称)的日志文件。
使用“tail -f
”会导致在重新创建/旋转文件时停止拖尾。
我想要做的是创建一个脚本来拖尾文件,然后在它达到100行之后,然后重新启动命令......或者甚至更好地在重新创建文件时重新启动命令?
有可能吗?
答案 0 :(得分:20)
是的!使用此方法(当文件不存在或无法访问时,重试将进行尾部重试,而不仅仅是失败 - 例如,当您更改文件时):
tail -f --retry <filename>
OR
tail --follow=name --retry
OR
tail -F <filename>
答案 1 :(得分:2)
尝试运行
watch "tail -f" yourfile.log
答案 2 :(得分:2)
如果尾部-F 不可用,并且您尝试从 logrotate 恢复,则可以将copytruncate
选项添加到logrotate.d/
因此,不是每次旋转后都创建一个新文件,而是保留并截断文件,同时旋转出一个副本。
这样,旧文件句柄继续指向新的(truncated)
日志文件,其中附加了新日志。
请注意,此copy-truncate
进程可能会丢失一些数据。
答案 3 :(得分:0)
由于你没有支持所有功能的尾部,并且因为你没有看,你可以使用一个无限循环的简单脚本来执行尾部。
#!/bin/bash
PID=`mktemp`
while true;
do
[ -e "$1" ] && IO=`stat -c %i "$1"`
[ -e "$1" ] && echo "restarting tail" && { tail -f "$1" 2> /dev/null & echo $! > $PID; }
# as long as the file exists and the inode number did not change
while [[ -e "$1" ]] && [[ $IO = `stat -c %i "$1"` ]]
do
sleep 0.5
done
[ ! -z $PID ] && kill `cat $PID` 2> /dev/null && echo > $PID
sleep 0.5
done 2> /dev/null
rm -rf $PID
您可能希望使用trap来干净地退出此脚本。这取决于你。
Basicaly,此脚本检查inode编号(使用stat -c %i "$1"
)是否更改为终止tail
命令并在重新创建文件时启动新命令。
注意:你可能会摆脱会污染输出的echo "restarting tail"
。它只对测试有用。如果在我们检查inode编号之后和开始尾部处理之前替换文件,也可能会出现问题。