使用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
|