目录变动监视 ::-- ZoomQuiet [2007-07-23 14:42:41]

CPUG联盟::

CPUG::门户plone

BPUG

SPUG

ZPUG

SpreadPython Python宣传

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

Name Password4deL ;) :( X-( B-)