2014-02-17 2 views
1

여기 달성하려는 노력의 축소 요구 사항이 있습니다.우분투에서 Popen이 시작한 Flask 서버를 죽일 수 없습니다.

# 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을 실행합니다. 그래서 app.py가 여전히 걸려

(t)[email protected]:/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 

: 쉘에서. 나는 커맨드 라인에서 그것을 죽여야 만한다. 실제로 마지막 줄인 run.py은 서버가 아직 활성 상태임을 나타냅니다 (200이 반환되었습니다).

나는 os.kill(server.pid, signal.SIGTERM)os.kill(server.pid, signal.SIGKILL)으로 죽이려고했지만 아무 것도 작동하지 않습니다.

일반적으로 kill이 작동하지만 신호를 수신 할 수없는 이유는 확실하지 않습니다. 나는 어떻게 든 플라스크가 멈추기를 거부하고 있다고 확신한다.

어떤 옵션이 있습니까?

위의 스크립트는 Mac OSX에서 완벽하게 작동합니다 (10.8.5, Mountain Lion). 지금까지 필자는 두 개의 우분투 12.04 머신에서 테스트를했으며, 동일한 동작을합니다. 저는 Mac OSX에서 우분투 컴퓨터와 Python 2.7.2 모두에서 Python 2.7.3을 실행하고 있습니다.

수정 : 유일한 옵션은 http://flask.pocoo.org/snippets/67/입니다. 그러나 나는하지 않는 것을 선호합니다. 그리고 네, Popen을 사용하여 출시해야합니다.

+0

안녕하세요. 같은 문제가 발생했습니다. 그러나, popen을 통해 플라스크를 실행하기 위해 shell = True를 설정해야하는 것처럼 보입니다. 그렇지 않으면 "raise child_exception OSError : [Errno 2] No such file or directory"와 같은 오류 메시지가 표시됩니다. 따라서 최종적으로 코드를 어떻게 수정했는지 궁금합니다. shell = True 일 때, popen에서 시작된 서버는 계속 실행됩니다. – Romaboy

답변

2

shell=True을 지정하면 명령이 하위 셸에 의해 실행됩니다.

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

server.terminate는 서브 쉘을 죽일 것이다, 그러나 웹 서버는 살해되지 않습니다.


확인 방법? print server.pidPopen 호출 후에 시도하고 ps 출력과 비교하십시오.

+0

예. 그거야. 나는''껍질 ''의 사용법을 오해했다. 그러나 검증 라인은 무엇을 의미합니까? 또한 왜 대몬 프로세스가 죽지 않을 수 있습니까? 고마워. – CppLearner

+0

@CppLearner,'print server.pid'와'ps .. '의 출력 | grep .. '은 다를 것입니다. – falsetru

+0

감사합니다. 이걸 더 잘 이해할 수있는 좋은 자료를 알고 있습니까? 나는 OS 책을 다시 읽으 려하지 않는다. 죄송하지만 도움을 주셔서 감사합니다. – CppLearner

2

Popen에서 shell=True을 제거하십시오. 그러면 첫 번째 요청이 생성됩니다. 프로세스를 종료하십시오. 그런 다음 두 번째 시도에 대한 예외를 throw합니다.

+0

고마워. 그거야. – CppLearner

+0

우리가 그곳에있는 동안이 지역을 더 잘 이해할 수있는 좋은 곳을 알고 있습니까 (두꺼운 OS 강좌를 다시 거치려는 것이 아닙니다). 미안하지만 고마워. – CppLearner

+0

@CppLearner는 무엇을 이해합니까? –