免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4082 | 回复: 0
打印 上一主题 下一主题

学习 subprocess [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-09-15 17:54 |只看该作者 |倒序浏览

                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了
http://bugs.python.org/issue2475
我的超时检查代码如下:
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的!所以不知道到底~~~
               
               
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/84280/showart_2053115.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP