Chinaunix首页 | 论坛 | 博客
  • 博客访问: 26316986
  • 博文数量: 2065
  • 博客积分: 10377
  • 博客等级: 上将
  • 技术积分: 21525
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-04 17:50
文章分类

全部博文(2065)

文章存档

2012年(2)

2011年(19)

2010年(1160)

2009年(969)

2008年(153)

分类: Python/Ruby

2009-09-15 17:54:57

1.直接贴代码进来
comm = "/data/mysql/bin/mysql -h"+host+" -u"+TESTDATA_USER+" -p"+TESTDATA_PASS+" -e 'show slave status\G'"
i = subprocess.Popen(comm,shell=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE)
print 'PARENT: Pausing before sending signal...'
       
print 'PARENT: Signaling %s' % i.pid
time.sleep(10)
print "".join(i.stdout.readlines()),"".join(i.stderr.readlines())
print i.poll()

这条命令我直接运行是没有问题的是可以直接运行出来结果的。
所以我们可以打印出来返回值出来。
然后我可以看到i.poll()是返回的为0

2.如果我不打印它的返回值再看i.poll()的返回值:
一样为0
其中原因我知道是为什么了一开始的循环时间我定的太短了。导致了命令没有正常执行完的!

没办法现在拉长再看看如果返回为0表示命令成功运行了!


如果这条命令能够正常运行的话就是返回 0 如果不能正常运行就返回none了!



def checkSlaveIOSQLStatus(host):       
       
    comm = "/data/mysql/bin/mysql -h"+host+" -u"+TESTDATA_USER+" -p"+TESTDATA_PASS+" -e 'show slave status\G'"
    print comm
    try:
       
        start = datetime.datetime.now()  
        i = subprocess.Popen(comm,shell=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE)
       
        while True:
            print 'PARENT: Signaling %s' % i.pid
            time.sleep(15)
            print i.poll()
            if i.poll() is None:
                print 'kill'
                os.kill(i.pid, signal.SIGUSR1)
                break
            else:
                print i.stdout.readlines()
                break
       

 直接进入休眠判断。如果返回值是None表示失败。如果返回0表示成功

学习如何进行多线程编程!




以下是引用一个网友的问题:

上几个帖子已经讨论过了,最后发现了问题最终出在subprocess.Popen后再调用poll想查看返回状态可能进程已经执行完了,这 poll就会失效无法正常反应出程序的执行状态,以往想利用poll测算的方案就是行不通了。 python目前已经公布这个bug了

我的检查代码如下: start = datetime.datetime.now() i = subprocess.Popen(command,shell=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE) while i.poll() is None: time.sleep(0.2) now = datetime.datetime.now() if (now - start).seconds> timeout: os.kill(i.pid, signal.SIGKILL) os.waitpid(-1, os.WNOHANG) return None,None return "".join(i.stdout.readlines()),"".join(i.stderr.readlines())

在这里说明一下,为什么我一定要获得状态:因为目前我们的应用主要在BI领域,需要从WEB服务器同步日志进行分析,同步的方式是使用rysnc, 有的时候rysnc中需要同步的服务器会联系不上,反映状态就是rysnc一直死等在那里,以前都是用perl的eval解决的,perl的eval可 以设置时间,但现在改用python了,就需要换一种方式。上面那段代码是我从网上找的,本以为已经解决了rysnc可能造成问题,没想到在 执行find命令的时候发生了问题,在我同样调用subprocess.Popen想执行find /tmp/big5/ -name '*.log' ,poll根本就没有响应,程序最后当成了处理。目前我试过了很多方式还是没


不过我测试发现如果执行成功是能够返回0的!所以不知道到底~~~



阅读(904) | 评论(0) | 转发(0) |
0

上一篇:Django的BUG吗?

下一篇:我使用的Python异常

给主人留下些什么吧!~~