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
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
希望对你有用 ^_^