我有一个充满滚动日志文件的目录,我希望能够使用tail。
文件的名称如下:
name modified
00A.txt Dec 27 19:00
00B.txt Dec 27 19:01
00C.txt Dec 27 19:02
00D.txt Dec 27 19:03
在一个较旧的unix系统上,我正在尝试提供一个shell脚本,该脚本将在特定目录中拖尾最近修改过的文件,如果该文件在管理上被关闭(滚动到下一个文件),我想要程序自动开始拖尾新文件,而不必打破尾巴重新运行。
tail -100f `ls -t | head -1`
给定上面的文件名,所需的行为将如下所示:
./logtailer.sh
然后脚本将开始拖尾00D.txt。一旦记录器完成写入00D.txt并且最新的日志文件现在命名为00E.txt,程序将自动开始拖尾该文件。
可以通过观察文件“文件管理已关闭”的尾部输出然后再次运行以下命令来编写此脚本。
tail -100f `ls -t | head -1`
有没有一种更优雅的方式来做到这一点,而不是通过观看“文件管理关闭”的文本?我怎样才能在shell脚本中逐行读取尾部的输出?
编辑:我应该解释一下尾部的-F标志对我来说不是一个选项。它使用不同版本的尾部,不包含此功能。 操作系统版本 - Solaris 10
答案 0 :(得分:19)
您可以使用-F
tail
选项来隐含--follow=name --retry
。
来自man
页面:
-F
The -F option implies the -f option, but tail will also check to see if the
file being followed has been renamed or rotated. The file is closed and
reopened when tail detects that the filename being read from has a new inode
number. The -F option is ignored if reading from standard input rather than
a file.
答案 1 :(得分:3)
您可能需要inotify
来检测新文件的创建,解决方法是在后台运行tail时继续轮询文件系统:
#!/bin/bash
get_latest() {
local files=(*.log)
local latest=${files[${#files[@]}-1]}
echo "$latest"
[[ $latest == $1 ]]
}
run_tail() {
tail -c +0 -f "$1"
}
while true; do
while current=$(get_latest "$current"); do
sleep 1
done
[[ $pid ]] && kill $pid
run_tail "$current" & pid=$!
done
(未经测试,不必要的hacky并小心旧系统的限制!)