python高手帮个忙

python高手帮个忙

刚看到了http://python-fam.sourceforge.net/这个项目
因为我不会python
麻烦哪个python高手给写一个python的脚本,监视本地某个文件夹,发现有文件变化时,每隔几分钟自动调用rsync把变化的文件或者文件夹同步到另外一台服务器,操作系统为*nix
不胜感激。。
直接把我用的给你吧
监控/home/www/html目录
rsync同步脚本是shell的,放在/home/www/www.sync.sh

大部分是抄来的,自己做了点小修改。流程是一段时间不发生目录修改操作后进行同步。用在ftp更新的web服务器上比较合适。
运行环境是 RHEL3 python2.4
应该在2.3上一样跑,只要你装了python_fam模块

[Copy to clipboard] [ - ]
CODE:
#!/usr/local/bin/python2.4
# ex: ts=4
#
# $Id: test.py,v 1.7 2003/01/29 21:39:08 gurubert Exp $
#

import os, sys

if os.name != 'posix':
        print 'I am sorry, but this script will run only on POSIX platforms.'
        sys.exit(1)

import _fam, time, signal, getopt, errno, select

# hash of filename => TestRequest
requests = {}
home="/home/www/html"
showreqid = None
suspend = None
cont = None
intr = None
usr1 = None
usr2 = None

class TestRequest:
        def __init__(self, userData, isDir):
                self.fr = None
                self.userData = userData
                self.isDir = isDir

def handle_stop(signum, frame):
        global suspend

        print 'Suspended!'
        suspend = 1

def handle_cont(signum, frame):
        global cont

        print 'Resumed!'
        signal.signal(signal.SIGCONT, handle_cont)
        cont = 1

def handle_int(signum, frame):
        global intr

        print 'Interupted!'
        signal.signal(signal.SIGINT, handle_int)
        intr = 1

def handle_usr1(signum, frame):
        global usr1

        print 'Got USR1!'
        signal.signal(signal.SIGUSR1, handle_usr1)
        usr1 = 1

def handle_usr2(signum, frame):
        global usr2

        print 'Got USR2!'
        signal.signal(signal.SIGUSR2, handle_usr2)
        usr2 = 1

def sendRequests():
        for path in requests.keys():
                if requests[path].isDir:
                        requests[path].fr = fc.monitorDirectory(path, requests[path].userData)
                else:
                        requests[path].fr = fc.monitorFile(path, requests[path].userData)

def processDirEvents(fe):
        code=fe.code2str()
        if code!="created" and code!="changed" and code!="deleted" and code!="moved":
                return
        if fe.filename[0]=="/":
                filename=fe.filename
        else:
                filename="%s/%s" % (fe.userData,fe.filename)
        print filename,code
        if code=="deleted":
                if requests.has_key(filename):
                        del(requests[filename])
                        print "dir %s deleted" % filename
        if code=="created":
                if os.path.isdir(filename):
                        if not requests.has_key(filename):
                                requests[filename] = TestRequest('%s' % filename, 1)
                                requests[filename].fr = fc.monitorDirectory(filename, requests[filename].userData)
                                print "dir %s added into monitor" % filename
fc = _fam.open()

for d in os.walk(home):
                requests[d[0]] = TestRequest('%s' % d[0], 1)

signal.signal(signal.SIGTSTP, handle_stop)
signal.signal(signal.SIGCONT, handle_cont)
signal.signal(signal.SIGINT, handle_int)
signal.signal(signal.SIGUSR1, handle_usr1)
signal.signal(signal.SIGUSR2, handle_usr2)

sendRequests()
lastevents=0
while 1:
        if suspend:
                for request in requests.values():
                        request.fr.suspendMonitor()
                        print 'Suspended monitoring of request %i' % request.fr.requestID()
                suspend = None
                signal.signal(signal.SIGTSTP, handle_stop)
        if cont:
                for request in requests.values():
                        request.fr.resumeMonitor()
                        print 'Resumed monitoring of request %i' % request.fr.requestID()
                cont = None
        if intr:
                # The dealloc methods of all objects should handle
                # FAMCancelMonitor and FAMClose
                sys.exit(0)
        if usr1:
                # Cancel all requests, close the connection, and reopen it.
                # This makes sure long-lived clients can connect, monitor, and
                # disconnect repeatedly without leaking.
                usr1 = None
                sleeptime = 1
                for request in requests.values():
                        print 'Cancelling monitoring of request %i' % request.fr.requestID()
                        request.fr.cancelMonitor()
                fc.close()
                print 'Closed connection, sleeping %d...' % sleeptime
                time.sleep(sleeptime)
                fc = _fam.open()
                sendRequests()
        if usr2:
                # Clean things up like a well-behaved client and exit.
                for request in requests.values():
                        print 'Cancelling monitoring of request %i' % request.fr.requestID()
                        request.fr.cancelMonitor()
                fc.close()
                print 'Closed connection'
                sys.exit(0)
        thisevents=0
        try:
                ri, ro, re = select.select([fc], [], [],5)
        except select.error, er:
                errnumber, strerr = er
                if errnumber == errno.EINTR:
                        continue
                else:
                        print strerr
                        sys.exit(1)
        while fc.pending():
                fe = fc.nextEvent()
                processDirEvents(fe)
                thisevents=thisevents+1
        if thisevents==0:
                print "lastevents %s" % lastevents
                if lastevents>0:
                        os.system("/home/www/www.sync.sh")
                lastevents=0
        else:
                lastevents=thisevents+lastevents

嗯,谢谢啦,嘿嘿


QUOTE:
原帖由 ttvast 于 2007-1-9 09:07 发表
直接把我用的给你吧
监控/home/www/html目录
rsync同步脚本是shell的,放在/home/www/www.sync.sh

大部分是抄来的,自己做了点小修改。流程是一段时间不发生目录修改操作后进行同步。用在ftp更新的web服务器 ...

/home/www/www.sync.sh 大体的格式能贴一下吗?

[Copy to clipboard] [ - ]
CODE:
./py-fam.sh
Traceback (most recent call last):
  File "./py-fam.sh", line 91, in ?
    fc = _fam.open()
IOError: _fam: unable to open connection



[Copy to clipboard] [ - ]
CODE:
   ts[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)

这个报错是为什么?

我对python是一点都不懂,所以只能麻烦你了

fam出错原因可能是
RH3下,需要启动PORTMAP和xinetd下的sgi_fam服务.

rsync你不会写不来吧,这个你要看MAN,因为各种情况很多的.


QUOTE:
原帖由 ttvast 于 2007-1-10 21:01 发表

rsync你不会写不来吧,这个你要看MAN,因为各种情况很多的.

rsync我是会写
但是我想知道的是怎么实现python监控某个目录在一定时间内发生变化的文件夹和文件,然后把这个列表传递给rsync,让rsync去把发生变化的文件夹和文件同步倒目标服务器上去
谢谢你的指点


QUOTE:
原帖由 LnBSD 于 2007-1-10 21:50 发表

rsync我是会写
但是我想知道的是怎么实现python监控某个目录在一定时间内发生变化的文件夹和文件,然后把这个列表传递给rsync,让rsync去把发生变化的文件夹和文件同步倒目标服务器上去
谢谢你的指点

你说的真对,我现在是rsync全同步的,就是从html根目录开始同步,的确可以做按照你说的这样,变化了什么文件夹就同步什么文件夹,不过现在我还没有实现


QUOTE:
原帖由 ttvast 于 2007-1-10 22:08 发表


你说的真对,我现在是rsync全同步的,就是从html根目录开始同步,的确可以做按照你说的这样,变化了什么文件夹就同步什么文件夹,不过现在我还没有实现

既然python-fam能监控某个目录的文件或者文件夹是否改变,难道就不能把这些发生改变的文件夹或者文件给打印出来吗?
如果能打印出来就可以传递给rsync或者ssh去自动的同步到远端的目标服务器
当然可以做到,我当初没有这样做而已,因为我们文件不多,更新也不频繁。主要变化是在数据库里的:)


QUOTE:
原帖由 ttvast 于 2007-1-10 23:42 发表
当然可以做到,我当初没有这样做而已,因为我们文件不多,更新也不频繁。主要变化是在数据库里的:)

那。。
我能不能提个过分的要求,你帮我写一个能实现类似的功能的python脚本

如果这样的话,估计在rsync不能单独写一个脚本了,要把rsync也整合在python脚本里面
python调用系统命令应该可以吧,嘿嘿
拭目以待哦
因为我不懂python,只能麻烦你了