目录变动监视 ::-- ZoomQuiet [DateTime(2007-07-23T14:42:41Z)] TableOfContents
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