⇤ ← Revision 1 as of 2007-07-23 14:42:41
Size: 6693
Comment:
|
Size: 6679
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
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