Differences between revisions 2 and 3
Revision 2 as of 2007-07-23 14:45:12
Size: 6679
Editor: ZoomQuiet
Comment:
Revision 3 as of 2007-07-23 14:50:44
Size: 6676
Editor: ZoomQuiet
Comment:
Deletions are marked like this. Additions are marked like this.
Line 111: Line 111:
                               requests[filename].fr =
fc.monitorDirectory(filename, requests[filename].userData)
                               requests[filename].fr =fc.monitorDirectory(filename, requests[filename].userData)
Line 144: Line 143:
               # Cancel all requests, close the connection, and
reopen it.
               # This makes sure long-lived clients can connect,
monitor, and
               # Cancel all requests, close the connection, and reopen it.
               # This makes sure long-lived clients can connect,monitor, and
Line 203: Line 200:

目录变动监视 ::-- ZoomQuiet [DateTime(2007-07-23T14:42:41Z)] TableOfContents

Include(CPUGnav)

1. 推荐.监控目录变化的脚本真不错

{{{[email protected]" <[email protected]> hide details 6:03 pm (3½ hours ago)

  • reply-to [email protected] to "python.cn" <[email protected]> date Jul 23, 2007 6:03 PM subject [CPyUG:29437] 这段监控目录变化的脚本真不错 mailed-by googlegroups.com

}}}

  • 本来计划自己写,调查过发现这样的好代码,比我原来构思的好许多许多,但还不太懂其工作原理 放这里给大家推荐使用

   1 #!/usr/local/bin/python2.4
   2 # ex: ts=4
   3 #
   4 # $Id: test.py,v 1.7 2003/01/29 21:39:08 gurubert Exp $
   5 #
   6 
   7 import os, sys
   8 
   9 if os.name != 'posix':
  10        print 'I am sorry, but this script will run only on POSIX
  11 platforms.'
  12        sys.exit(1)
  13 
  14 import _fam, time, signal, getopt, errno, select
  15 
  16 # hash of filename => TestRequest
  17 requests = {}
  18 home="/home/www/html"
  19 showreqid = None
  20 suspend = None
  21 cont = None
  22 intr = None
  23 usr1 = None
  24 usr2 = None
  25 
  26 class TestRequest:
  27        def __init__(self, userData, isDir):
  28                self.fr = None
  29                self.userData = userData
  30                self.isDir = isDir
  31 
  32 def handle_stop(signum, frame):
  33        global suspend
  34 
  35        print 'Suspended!'
  36        suspend = 1
  37 
  38 def handle_cont(signum, frame):
  39        global cont
  40 
  41        print 'Resumed!'
  42        signal.signal(signal.SIGCONT, handle_cont)
  43        cont = 1
  44 
  45 def handle_int(signum, frame):
  46        global intr
  47 
  48        print 'Interupted!'
  49        signal.signal(signal.SIGINT, handle_int)
  50        intr = 1
  51 
  52 def handle_usr1(signum, frame):
  53        global usr1
  54 
  55        print 'Got USR1!'
  56        signal.signal(signal.SIGUSR1, handle_usr1)
  57        usr1 = 1
  58 
  59 def handle_usr2(signum, frame):
  60        global usr2
  61 
  62        print 'Got USR2!'
  63        signal.signal(signal.SIGUSR2, handle_usr2)
  64        usr2 = 1
  65 
  66 def sendRequests():
  67        for path in requests.keys():
  68                if requests[path].isDir:
  69                        requests[path].fr = fc.monitorDirectory(path,requests[path].userData)
  70                else:
  71                        requests[path].fr = fc.monitorFile(path,requests[path].userData)
  72 
  73 def processDirEvents(fe):
  74        code=fe.code2str()
  75        if code!="created" and code!="changed" and code!="deleted" and code!="moved":
  76                return
  77        if fe.filename[0]=="/":
  78                filename=fe.filename
  79        else:
  80                filename="%s/%s" % (fe.userData,fe.filename)
  81        print filename,code
  82        if code=="deleted":
  83                if requests.has_key(filename):
  84                        del(requests[filename])
  85                        print "dir %s deleted" % filename
  86        if code=="created":
  87                if os.path.isdir(filename):
  88                        if not requests.has_key(filename):
  89                                requests[filename] = TestRequest('%s'% filename, 1)
  90                                requests[filename].fr =fc.monitorDirectory(filename, requests[filename].userData)
  91                                print "dir %s added into monitor" %filename
  92 fc = _fam.open()
  93 
  94 for d in os.walk(home):
  95                requests[d[0]] = TestRequest('%s' % d[0], 1)
  96 
  97 signal.signal(signal.SIGTSTP, handle_stop)
  98 signal.signal(signal.SIGCONT, handle_cont)
  99 signal.signal(signal.SIGINT, handle_int)
 100 signal.signal(signal.SIGUSR1, handle_usr1)
 101 signal.signal(signal.SIGUSR2, handle_usr2)
 102 
 103 sendRequests()
 104 lastevents=0
 105 while 1:
 106        if suspend:
 107                for request in requests.values():
 108                        request.fr.suspendMonitor()
 109                        print 'Suspended monitoring of request %i' %request.fr.requestID()
 110                suspend = None
 111                signal.signal(signal.SIGTSTP, handle_stop)
 112        if cont:
 113                for request in requests.values():
 114                        request.fr.resumeMonitor()
 115                        print 'Resumed monitoring of request %i' % request.fr.requestID()
 116                cont = None
 117        if intr:
 118                # The dealloc methods of all objects should handle
 119                # FAMCancelMonitor and FAMClose
 120                sys.exit(0)
 121        if usr1:
 122                # Cancel all requests, close the connection, and reopen it.
 123                # This makes sure long-lived clients can connect,monitor, and
 124                # disconnect repeatedly without leaking.
 125                usr1 = None
 126                sleeptime = 1
 127                for request in requests.values():
 128                        print 'Cancelling monitoring of request %i' % request.fr.requestID()
 129                        request.fr.cancelMonitor()
 130                fc.close()
 131                print 'Closed connection, sleeping %d...' % sleeptime
 132                time.sleep(sleeptime)
 133                fc = _fam.open()
 134                sendRequests()
 135        if usr2:
 136                # Clean things up like a well-behaved client and exit.
 137                for request in requests.values():
 138                        print 'Cancelling monitoring of request %i' % request.fr.requestID()
 139                        request.fr.cancelMonitor()
 140                fc.close()
 141                print 'Closed connection'
 142                sys.exit(0)
 143        thisevents=0
 144        try:
 145                ri, ro, re = select.select([fc], [], [],5)
 146        except select.error, er:
 147                errnumber, strerr = er
 148                if errnumber == errno.EINTR:
 149                        continue
 150                else:
 151                        print strerr
 152                        sys.exit(1)
 153        while fc.pending():
 154                fe = fc.nextEvent()
 155                processDirEvents(fe)
 156                thisevents=thisevents+1
 157        if thisevents==0:
 158                print "lastevents %s" % lastevents
 159                if lastevents>0:
 160                        os.system("/home/www/www.sync.sh")
 161                lastevents=0
 162        else:
 163                lastevents=thisevents+lastevents

1.1. 建议

{{{HuangJiahua <[email protected]> hide details 7:47 pm (2 hours ago)

  • reply-to [email protected] to "python.cn" <[email protected]> date Jul 23, 2007 7:47 PM subject [CPyUG:29442] Re: 这段监控目录变化的脚本真不错 mailed-by googlegroups.com

}}}

  • 很有一句之师的样子

Linux 下还是用 python-pyinotify 更好些,
旧版本 linux 可以用 python-gamin

1.2. 反馈

PageComment2

MicroProj/2007-07-23 (last edited 2009-12-25 07:16:38 by localhost)