2011-12-27 71 views
15

我有一個完整的滾動日誌文件的目錄,我希望能夠使用尾巴。拖尾滾動文件

文件被命名爲這樣:

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,程序就會自動開始拖尾該文件。

可以通過觀察文本「文件Administratively Closed」的尾部輸出來編寫該腳本,然後再次運行以下命令。

tail -100f `ls -t | head -1` 

有沒有更優雅的方式來做到這一點比留意文本「文件,行政關閉」?我怎麼才能在shell腳本中逐行閱讀尾部輸出?

編輯:我應該解釋,在這個系統上,我不能選擇尾部的-F標誌。它使用不包含此功能的不同版本的尾部。 操作系統版本 - Solaris 10

回答

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. 
+0

我希望我可以使用這個標誌,但我的版本的尾巴沒有這個功能,我沒有選擇升級。 (沒有管理權限) – user1118047 2011-12-27 18:43:16

+0

你可以提供你正在使用的'tail'和'box(unix/linux)'版本信息嗎? – 2011-12-27 18:46:14

+1

SunOS 5.10 不確定如何找到尾巴的版本... – user1118047 2011-12-27 18:56:52

3

您可能需要inotify檢測到新文件的創建,應該是一個解決辦法是保持輪詢文件系統,而在後臺運行的尾巴:

#!/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 

(未經測試,unnecesarily哈克和小心你的舊體制的限制!)

+1

我喜歡這個答案的去向......我無法將這個權利插入到shell腳本中並讓它做我想做的事,但我會在這裏玩弄代碼,看看我能做些什麼來使它工作。 – user1118047 2011-12-27 21:37:14