Differences between revisions 1 and 2
Revision 1 as of 2007-07-23 14:42:41
Size: 6693
Editor: ZoomQuiet
Comment:
Revision 2 as of 2007-07-23 14:45:12
Size: 6679
Editor: ZoomQuiet
Comment:
Deletions are marked like this. Additions are marked like this.
Line 90: Line 90:
                       requests[path].fr = fc.monitorDirectory(path,
requests[path].userData)
                       requests[path].fr = fc.monitorDirectory(path,requests[path].userData)
Line 93: Line 92:
                       requests[path].fr = fc.monitorFile(path,
requests[path].userData)
                       requests[path].fr = fc.monitorFile(path,requests[path].userData)
Line 98: Line 96:
       if code!="created" and code!="changed" and code!="deleted" and
code!="moved":
       if code!="created" and code!="changed" and code!="deleted" and code!="moved":
Line 113: Line 110:
                               requests[filename] = TestRequest('%s'
% filename, 1)
                               requests[filename] = TestRequest('%s'% filename, 1)
Line 117: Line 113:
                               print "dir %s added into monitor" %
filename
                               print "dir %s added into monitor" %filename
Line 136: Line 131:
                       print 'Suspended monitoring of request %i' %
request.fr.requestID()
                       print 'Suspended monitoring of request %i' %request.fr.requestID()
Line 143: Line 137:
                       print 'Resumed monitoring of request %i' %
request.fr.requestID()
                       print 'Resumed monitoring of request %i' % request.fr.requestID()
Line 159: Line 152:
                       print 'Cancelling monitoring of request %i' %
request.fr.requestID()
                       print 'Cancelling monitoring of request %i' % request.fr.requestID()
Line 170: Line 162:
                       print 'Cancelling monitoring of request %i' %
request.fr.requestID()
                       print 'Cancelling monitoring of request %i' % request.fr.requestID()

目录变动监视 ::-- 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 =
  91 fc.monitorDirectory(filename, requests[filename].userData)
  92                                print "dir %s added into monitor" %filename
  93 fc = _fam.open()
  94 
  95 for d in os.walk(home):
  96                requests[d[0]] = TestRequest('%s' % d[0], 1)
  97 
  98 signal.signal(signal.SIGTSTP, handle_stop)
  99 signal.signal(signal.SIGCONT, handle_cont)
 100 signal.signal(signal.SIGINT, handle_int)
 101 signal.signal(signal.SIGUSR1, handle_usr1)
 102 signal.signal(signal.SIGUSR2, handle_usr2)
 103 
 104 sendRequests()
 105 lastevents=0
 106 while 1:
 107        if suspend:
 108                for request in requests.values():
 109                        request.fr.suspendMonitor()
 110                        print 'Suspended monitoring of request %i' %request.fr.requestID()
 111                suspend = None
 112                signal.signal(signal.SIGTSTP, handle_stop)
 113        if cont:
 114                for request in requests.values():
 115                        request.fr.resumeMonitor()
 116                        print 'Resumed monitoring of request %i' % request.fr.requestID()
 117                cont = None
 118        if intr:
 119                # The dealloc methods of all objects should handle
 120                # FAMCancelMonitor and FAMClose
 121                sys.exit(0)
 122        if usr1:
 123                # Cancel all requests, close the connection, and
 124 reopen it.
 125                # This makes sure long-lived clients can connect,
 126 monitor, and
 127                # disconnect repeatedly without leaking.
 128                usr1 = None
 129                sleeptime = 1
 130                for request in requests.values():
 131                        print 'Cancelling monitoring of request %i' % request.fr.requestID()
 132                        request.fr.cancelMonitor()
 133                fc.close()
 134                print 'Closed connection, sleeping %d...' % sleeptime
 135                time.sleep(sleeptime)
 136                fc = _fam.open()
 137                sendRequests()
 138        if usr2:
 139                # Clean things up like a well-behaved client and exit.
 140                for request in requests.values():
 141                        print 'Cancelling monitoring of request %i' % request.fr.requestID()
 142                        request.fr.cancelMonitor()
 143                fc.close()
 144                print 'Closed connection'
 145                sys.exit(0)
 146        thisevents=0
 147        try:
 148                ri, ro, re = select.select([fc], [], [],5)
 149        except select.error, er:
 150                errnumber, strerr = er
 151                if errnumber == errno.EINTR:
 152                        continue
 153                else:
 154                        print strerr
 155                        sys.exit(1)
 156        while fc.pending():
 157                fe = fc.nextEvent()
 158                processDirEvents(fe)
 159                thisevents=thisevents+1
 160        if thisevents==0:
 161                print "lastevents %s" % lastevents
 162                if lastevents>0:
 163                        os.system("/home/www/www.sync.sh")
 164                lastevents=0
 165        else:
 166                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)