2011-07-26 31 views
18

我需要創建一個腳本來尾部被重新創建日誌文件(名稱相同)的解決方案達到一定規模後的日誌文件。如何使用尾巴查看經常重新

使用「尾-f」導致拖尾時停止該文件被重新創建/旋轉。

我想什麼做的是創建一個腳本,將尾部的文件,它達到100線,例如後然後重新啓動命令,甚至更好時,創建該文件,重新啓動命令?是這樣的可能嗎?

謝謝!

回答

2

嘗試運行

watch "tail -f" yourfile.log 
+0

手錶在我運行的系統上不可用 – gfunk

15

是的!使用這個(重試將使尾重試時,文件不存在或不可訪問,而不僅僅是失敗 - 如可能,當你改變的文件):

tail -f --retry <filename> 

OR

tail --follow=name --retry 

OR

tail -F <filename> 
+0

這看起來好像會工作得很好,但我得到一個錯誤。 – gfunk

+0

〜> tail -f --follow = name --retry /logs/logs/log.log tail:無法打開輸入 – gfunk

+0

看起來你有兩次'/ logs'。那是故意的嗎?如果該文件不存在或者您沒有權限,則會出現錯誤。但是,使用'--retry'它會繼續嘗試,直到文件存在或者您有權限。先用當前目錄中的測試文件試一下。 – evan

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 

您可能需要使用陷阱完全退出此腳本。這取決於你。

Basicaly,這個腳本檢查inode號碼(使用stat -c %i "$1")是否改變來殺死tail命令並在重新創建文件時啓動一個新的命令。

注意:您可能擺脫echo "restarting tail"它會污染你的輸出。它僅用於測試。如果在檢查inode編號之後並且在開始尾部處理之前替換文件,也可能會出現問題。

2

如果尾巴-F是可用,你正試圖從logrotate的恢復,您可以將copytruncate選項添加到您的logrotate.d/規範文件,以便代替旋轉後每次創建一個新的文件,該文件被保留並被截斷,而副本被旋出。

這樣舊的文件句柄繼續以指向新的日誌記錄在新(truncated)日誌文件。

注意,有可能是在這個過程中copy-truncate一些數據丟失。