今天在做一个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
希望对你有用 ^_^