全部博文(298)
分类: Python/Ruby
2012-02-18 21:29:05
使用shell进行定时监控
题目:使用shell脚本对文件进行定时监控,可以自己设置监控时间和监控的文件。
解答:通过定时sleep,然后在时间到的时候查看文件的修改时间是否与上次的修改时间一致,如果相同,表示文件没有被修改,如果不同表示文件已经被修改并进行备份对比,查看是哪些地方进行了修改。
#! /bin/bash -
declare -f getparam
declare -f getstatus
declare -f modification
declare -f loop
declare -i timeval=5
filename=""
lasttime=""
visittime=""
function getparam()
{
if [ $# -le 1 ]; then
printf "usage:$0 [-f filename] [-t timeval]\n"
exit 1
fi
while getopts "f:t:" opt
do
case $opt in
f) filename=$OPTARG;;
t) timeval=$OPTARG;;
?)
printf "usage:$0 [-f filename] [-t timeval]\n"
exit 1;;
# *)
# printf "usage:$0 [-f filename] [-t timeval]\n"
# exit 1
esac
done
#注意双括号的用法 执行双括号里面的内容
#shift 去掉-f -t选项 只留下最后的参数
shift $(($OPTIND-1))
}
function getstatus()
{
if [ "$filename" = "" ] || [ ! -e $filename ]; then
printf "invalid file: $filename\n"
exit 2
fi
printf "Start monitor $filename changement\n"
lasttime=`stat $filename | grep 'Modify' | cut -d " " -f3 | cut -d "." -f1`
#全部拷贝 包括修改时间等等 -a
cp -a $filename $filename.bak
}
function modification()
{
username=`stat $filename | grep Uid | cut -d "/" -f3 | cut -d ")" -f1 | cut -d " " -f5`
ip=`last | grep $username | sed -n '$p' | awk '{print $3}'`
printf "Modify by $username $ip in $visittime\n"
diff -Naur $filename.bak $filename > ${visittime}_${username}_${ip}.patch
cp -a $filename $filename.bak
lasttime=$visittime
}
function loop()
{
while [ 1 ]
do
visittime=`stat $filename | grep 'Modify' | cut -d " " -f3 | cut -d "." -f1`
if [ $lasttime != $visittime ]; then
modification
fi
sleep $timeval
done
}
#set -x
getparam "$@"
getstatus
loop
exit 0