##language:zh #pragma section-numbers on ''' 目录变动监视 ''' ::-- ZoomQuiet [<>] <> ## 默许导航,请保留 <> = 推荐.监控目录变化的脚本真不错 = {{{luckrill@gmail.com" hide details 6:03 pm (3½ hours ago) reply-to python-cn@googlegroups.com to "python.cn" date Jul 23, 2007 6:03 PM subject [CPyUG:29437] 这段监控目录变化的脚本真不错 mailed-by googlegroups.com }}} * 本来计划自己写,调查过发现这样的好代码,比我原来构思的好许多许多,但还不太懂其工作原理 放这里给大家推荐使用 {{{#!python #!/usr/local/bin/python2.4 # ex: ts=4 # # $Id: test.py,v 1.7 2003/01/29 21:39:08 gurubert Exp $ # import os, sys if os.name != 'posix': print 'I am sorry, but this script will run only on POSIX platforms.' sys.exit(1) import _fam, time, signal, getopt, errno, select # hash of filename => TestRequest requests = {} home="/home/www/html" showreqid = None suspend = None cont = None intr = None usr1 = None usr2 = None class TestRequest: def __init__(self, userData, isDir): self.fr = None self.userData = userData self.isDir = isDir def handle_stop(signum, frame): global suspend print 'Suspended!' suspend = 1 def handle_cont(signum, frame): global cont print 'Resumed!' signal.signal(signal.SIGCONT, handle_cont) cont = 1 def handle_int(signum, frame): global intr print 'Interupted!' signal.signal(signal.SIGINT, handle_int) intr = 1 def handle_usr1(signum, frame): global usr1 print 'Got USR1!' signal.signal(signal.SIGUSR1, handle_usr1) usr1 = 1 def handle_usr2(signum, frame): global usr2 print 'Got USR2!' signal.signal(signal.SIGUSR2, handle_usr2) usr2 = 1 def sendRequests(): for path in requests.keys(): if requests[path].isDir: requests[path].fr = fc.monitorDirectory(path,requests[path].userData) else: requests[path].fr = fc.monitorFile(path,requests[path].userData) def processDirEvents(fe): code=fe.code2str() if code!="created" and code!="changed" and code!="deleted" and code!="moved": return if fe.filename[0]=="/": filename=fe.filename else: filename="%s/%s" % (fe.userData,fe.filename) print filename,code if code=="deleted": if requests.has_key(filename): del(requests[filename]) print "dir %s deleted" % filename if code=="created": if os.path.isdir(filename): if not requests.has_key(filename): requests[filename] = TestRequest('%s'% filename, 1) requests[filename].fr =fc.monitorDirectory(filename, requests[filename].userData) print "dir %s added into monitor" %filename fc = _fam.open() for d in os.walk(home): requests[d[0]] = TestRequest('%s' % d[0], 1) signal.signal(signal.SIGTSTP, handle_stop) signal.signal(signal.SIGCONT, handle_cont) signal.signal(signal.SIGINT, handle_int) signal.signal(signal.SIGUSR1, handle_usr1) signal.signal(signal.SIGUSR2, handle_usr2) sendRequests() lastevents=0 while 1: if suspend: for request in requests.values(): request.fr.suspendMonitor() print 'Suspended monitoring of request %i' %request.fr.requestID() suspend = None signal.signal(signal.SIGTSTP, handle_stop) if cont: for request in requests.values(): request.fr.resumeMonitor() print 'Resumed monitoring of request %i' % request.fr.requestID() cont = None if intr: # The dealloc methods of all objects should handle # FAMCancelMonitor and FAMClose sys.exit(0) if usr1: # Cancel all requests, close the connection, and reopen it. # This makes sure long-lived clients can connect,monitor, and # disconnect repeatedly without leaking. usr1 = None sleeptime = 1 for request in requests.values(): print 'Cancelling monitoring of request %i' % request.fr.requestID() request.fr.cancelMonitor() fc.close() print 'Closed connection, sleeping %d...' % sleeptime time.sleep(sleeptime) fc = _fam.open() sendRequests() if usr2: # Clean things up like a well-behaved client and exit. for request in requests.values(): print 'Cancelling monitoring of request %i' % request.fr.requestID() request.fr.cancelMonitor() fc.close() print 'Closed connection' sys.exit(0) thisevents=0 try: ri, ro, re = select.select([fc], [], [],5) except select.error, er: errnumber, strerr = er if errnumber == errno.EINTR: continue else: print strerr sys.exit(1) while fc.pending(): fe = fc.nextEvent() processDirEvents(fe) thisevents=thisevents+1 if thisevents==0: print "lastevents %s" % lastevents if lastevents>0: os.system("/home/www/www.sync.sh") lastevents=0 else: lastevents=thisevents+lastevents }}} == 建议 == {{{HuangJiahua hide details 7:47 pm (2 hours ago) reply-to python-cn@googlegroups.com to "python.cn" date Jul 23, 2007 7:47 PM subject [CPyUG:29442] Re: 这段监控目录变化的脚本真不错 mailed-by googlegroups.com }}} * 很有一句之师的样子 {{{ Linux 下还是用 python-pyinotify 更好些, 旧版本 linux 可以用 python-gamin }}} == 反馈 ==