今天在做一个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

希望对你有用 ^_^