目录变动监视 ::-- ZoomQuiet [2007-07-23 14:42:41]
Contents
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