Answers:
你可以用tail command
与-f
:
tail -f /var/log/syslog
这是实时显示的好解决方案。
-F
(大写字母f),如果在删除文件并重新创建文件时重新打开文件。
当我需要检测文件更改并执行其他tail -f filename
操作时,我inotifywait
在脚本中使用了检测更改并采取措施。使用示例如下所示。有关man inotifywait
其他事件名称和开关,请参见。您可能需要安装inotify-tools
软件包,例如通过sudo apt-get install inotify-tools
。
这是示例脚本,名为exec-on-change
:
#!/bin/sh
# Detect when file named by param $1 changes.
# When it changes, do command specified by other params.
F=$1
shift
P="$*"
# Result of inotifywait is put in S so it doesn't echo
while S=$(inotifywait -eMODIFY $F 2>/dev/null)
do
# Remove printf if timestamps not wanted
printf "At %s: \n" "$(date)"
$P
done
在两个控制台中,我输入如下命令(其中A>表示在控制台A中输入,B>表示在控制台B中输入。)
A> rm t; touch t
B> ./exec-on-change t wc t
A> date >>t
A> date -R >>t
A> date -Ru >>t
A> cat t; rm t
以下输出来自cat t
控制台A中:
Thu Aug 16 11:57:01 MDT 2012
Thu, 16 Aug 2012 11:57:04 -0600
Thu, 16 Aug 2012 17:57:07 +0000
以下输出来自exec-on-change
控制台B中:
At Thu Aug 16 11:57:01 MDT 2012:
1 6 29 t
At Thu Aug 16 11:57:04 MDT 2012:
2 12 61 t
At Thu Aug 16 11:57:07 MDT 2012:
3 18 93 t
在exec-on-change
我的脚本终止rm
倒是t
。
我有三种解决方案:
1) tail -f
是个好主意
2)我们还tailf
必须使用
3)第三个是bash脚本:
#!/bin/bash
GAP=10 #How long to wait
LOGFILE=$1 #File to log to
if [ "$#" -ne "1" ]; then
echo "USAGE: `basename $0` <file with absolute path>"
exit 1
fi
#Get current long of the file
len=`wc -l $LOGFILE | awk '{ print $1 }'`
echo "Current size is $len lines."
while :
do
if [ -N $LOGFILE ]; then
echo "`date`: New Entries in $LOGFILE: "
newlen=`wc -l $LOGFILE | awk ' { print $1 }'`
newlines=`expr $newlen - $len`
tail -$newlines $LOGFILE
len=$newlen
fi
sleep $GAP
done
exit 0