无法杀死Popen在Ubuntu上发布的Flask服务器

时间:2014-02-17 08:54:37

标签: python flask popen

以下是我想要达到的要求的减少。

# run.py
import requests
import time

from subprocess import Popen, PIPE

server = Popen("./app.py", stdout=PIPE, stderr=PIPE, shell=True)
time.sleep(1)
res = requests.get("http://localhost:1234/")
assert res.status_code == 200
server.kill()
server.terminate()
res = requests.get("http://localhost:1234/")
print res

实际的服务器脚本。

#!/usr/bin/env python
from flask import Flask, make_response, request

app = Flask(__name__)
@app.route('/')
def view():
    return make_response("")

if __name__ == "__main__":
    app.run(host="localhost", port=1234)

在命令行上,我运行python run.py。来自shell:

(t)yeukhon@fubini:/tmp$ ps aux|grep app
yeukhon  21452  0.6  0.4  16416  9992 pts/2    S    03:50   0:00 python ./app.py
yeukhon  21471  0.0  0.0   4384   804 pts/2    S+   03:51   0:00 grep --color=auto app

所以app.py仍然悬在那里。我必须从命令行中删除它。事实上,run.py的最后一行告诉我们服务器仍然存活(返回200)。

我试图用os.kill(server.pid, signal.SIGTERM)os.kill(server.pid, signal.SIGKILL)杀死但没有效果。

通常kill会起作用,但我真的不确定为什么它无法接收信号。我确信Flask拒绝停止。

我有哪些选择?

奇怪的是,我上面的脚本在Mac OSX上完全正常(我在10.8.5,Mountain Lion)。到目前为止,我已经在两台Ubuntu 12.04机器上进行了测试,它们具有相同的行为。我在Ubuntu机器上运行Python 2.7.3,在Mac OSX上运行Python 2.7.2。

校正: 我唯一的选择是使用http://flask.pocoo.org/snippets/67/。但我不愿意。是的,我必须使用Popen启动一个。

2 个答案:

答案 0 :(得分:2)

通过指定shell=True,命令由子shell运行。

server = Popen("./app.py", stdout=PIPE, stderr=PIPE, shell=True)

server.terminate将终止子shell,但不会杀死Web服务器。


如何验证? print server.pid调用后尝试Popen,并将其与ps输出进行比较。

答案 1 :(得分:2)

从您的Popen中删除shell=True。这将是第一个请求。杀死这个过程。然后为第二次尝试抛出异常。