2014-05-17 2 views
1

유닉스 기반의 OS에서 플라스크와 플라스크의 내부 웹 서버를 사용합니다. 나는 그것을 달리게한다. 내가 플라스크 응용 프로그램, 나는 다시 다른 서비스를 중지하면파이썬은 소켓으로 열리는 모든 파일 기술자를 얻습니다.

APP.run(host='', port=8000, threaded=True, debug=False) 

내가

for service in ACTIVE_SERVICES: 
     command = "/etc/init.d/%s restart" % service 
     # stdout and stderr are string which output of command 
     stdout, stderr = Popen(command, stdout=PIPE, stderr=PIPE,shell=True).communicate() 

처럼 내 코드에서 일부 serivces를 다시 시작, 8000 포트를 듣고 시작합니다. 서브 프로세스에 의해 계승 된 플라스크에 의해 열리는 파일 기술자에 의해 발생합니다. 이 문제를 방지하기 위해 소켓의 모든 파일 설명자에 접근하려고합니다. 어떻게 할 수 있니?

답변

1

이 문제를 해결하기 위해 gc을 사용하면 모든 생성 개체를 가져올 수 있습니다. 소켓을 만들고 바인딩 한 후에이 코드를 실행하고 모든 소켓 객체를 가져올 수 있습니다.

for sock in filter(lambda x: type(x) == socket._socketobject, gc.get_objects()): 
    fd = sock.fileno() 
    old_flags = fcntl.fcntl(fd, fcntl.F_GETFD) 
    fcntl.fcntl(fd, fcntl.F_SETFD, old_flags | fcntl.FD_CLOEXEC) 

이 코드는 소켓의 파일 설명자를 상속하지 않도록합니다.

+0

fcntl은 UNIX에 따라 다르며 Windows에서는 사용할 수 없습니다. Windows에 대한 해결 방법이 있습니까? – sudonym

1

그런 경우 Popen은 close_fds = True로 호출해야합니다.

관련 문제