使用inotifywait命令监控服务器svn的修改

发布: 2013-07-23 09:22

一般在维护SVN服务器的时候,都会有一些特殊的需要,比如对svn目录的的自动checkout,checkout后的文件权限修改,以及对更新的文件做某些处理。

这里展示一个我这服务器使用的一个简单脚本,是用来处理某些本地操作方式导致svn的目录中文件权限出错的问题。

其重点还是介绍linux系统的inotify模式功能,异步IO事件机制在实际工作中的应用。
异步事件的分类大概包括:文件创建,文件修改,文件打开、关闭等,还有一些组合戒指事件,可以使用man inotify获取更准确详细的说明。
这个模式在使用其他语言处理IO事件的时候也结非常有用,像在C/C++,PHP,等。

比如,如果没有这种异步IO事件通知的话,如果希望知道某目录下的文件修改,可能需要定时列出目录下的文件做比较,这种方法古老低效,容易出错。

示例演示,
[code type="shell"]
#!/bin/sh

## 监控svn checkout目录,如果权限有非nobody的文件,改掉
## 如果有异常的文能及时修正,让这套系统正常运转

EVT_FILE=/tmp/svnattr_event.lst

echo 81920 > /proc/sys/fs/inotify/max_user_watches
while true
do
touch $EVT_FILE;
truncate --size 0 $EVT_FILE;
inotifywait -r -e attrib --outfile $EVT_FILE /data1/HTML

while read eline
do
epath=$(echo "$eline" | awk '{print $1}')
ename=$(echo "$eline" | awk '{print $2}')
efile=$(echo "$eline" | awk '{print $3}')

echo "file changed: $epath $ename $efile";

flt=$(echo "$efile" | grep .swp | grep -v grep)
if [ x"$flt" = x"" ] ; then
echo "change attr to nobody.nobody(755)...";
chown -R nobody.nobody "$epath"
chmod -R 755 "$epath"
fi
done < $EVT_FILE;

# maybe other file has this problem
u0_fc=0
u0_files=$(find /data1/HTML -uid 0 | tee /tmp/epfile.txt)
if [ x"$u0_files" = x"" ] ; then
true
else
#for f in $u0_files
while read f
do
chown nobody.nobody "$f"
chmod 755 "$f"
u0_fc=$(expr $u0_fc + 1)
done < /tmp/epfile.txt
unlink /tmp/epfile.txt
fi
if [ $u0_fc -gt 0 ] ; then
echo "recorrect $u0_fc permission files.";
else
echo "all files no permission problem.";
fi
done
[/code]



原文: http://qtchina.tk/?q=node/711

Powered by zexport