subprocess.Popen() 必须加上close_fds=True

今天在做一个web页面控制memcached重启的功能,本以为非常简单,不就获取pid,然后kill,在重新启动memcached就这么简单。

没想到使用subprocess.Popen() 来调用命令时竟然发现response确实是返回到客户端了,但是服务器端和客户端的http连接竟然还连接着,一直不断。

查看了一下python的文档,发现:http://docs.python.org/library/subprocess.html

popen2 closes all file descriptors by default, but you have to specify close_fds=True with Popen

 

 

我的代码如下:

 

def _restart(port, start_cmd):
    cmd 
= 'ps aux | grep "memcached .* %s"' % port
    p 
= subprocess.Popen(cmd, shell=True, close_fds=True, # 必须加上close_fds=True,否则子进程会一直存在
                         stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    stdoutdata, stderrdata 
= p.communicate()
    
if p.returncode != 0:
        
return False, error_response(cmd, stderrdata)
    
for r in stdoutdata.split('\n'):
        
if cmd in r:
            
continue
        
break
    
if r:
        pid 
= r.split()[1]
        
        cmd 
= 'kill %s' % pid
        p 
= subprocess.Popen(cmd, shell=True, close_fds=True,
                             stdout
=subprocess.PIPE, stderr=subprocess.PIPE)
        p.communicate()
    p 
= subprocess.Popen(start_cmd, shell=True, close_fds=True,
                         stdout
=subprocess.PIPE, stderr=subprocess.PIPE)
    stdoutdata, stderrdata 
= p.communicate()
    
if p.returncode != 0:
        
return False, error_response(cmd, stderrdata)
    
return True, None

 

 

希望对你有用 ^_^

posted @ 2009-02-06 15:15  MK2  阅读(7412)  评论(2编辑  收藏  举报