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的!所以不知道到底~~~
阅读(928) | 评论(0) | 转发(0) |