2016-07-24 2 views
1

나는이 같은 exec 명령으로 PHP를 사용하여 파이썬 스크립트를 실행하기 위해 노력하고있어 죽지 않습니다파이썬 스크립트 내에서 살해되어 있지만 과정은

exec("python /address/to/script.py"); 

내가하는 스크립트가 필요하지 않습니다 완료까지 달려서 내가 필요한 것을 수행 한 후에 sys.exit()으로 연락합니다. 실행은 PHP 스크립트로 돌아가지만, 파이썬 프로세스가 여전히 실행 중이다. 내 서버의 프로세스 목록에서 볼 수 있습니다. 그것을 완전히 없애기 위해 더 많은 것이 있습니까?

추가 정보

  • 파이썬 스크립트는 타사에 의해 작성되었습니다.

  • 나는 파이썬에 대해 거의 알지 못하지만, sys.exit() 호출을 추가하기에 충분합니다.

답변

0

스크립트는 여전히 정리 코드를 실행할 수 있습니다, 또는 당신은 부모 프로세스 실행을 떠나, 기본적으로 thread.exit()를 호출 될 자식 프로세스에서 sys.exit()를 호출 할 수있다.

sys.exit() 호출이 스크립트의 주요 부분에 있고, 오류 처리가 SystemExit 예외를 방해하지 않는지 확인하거나 또는 os._exit()을 시도 할 수 있습니다. 또한 exec()에 전달 된 명령 내에 앰퍼샌드 (&)가 없으면 스크립트가 백그라운드 프로세스로 실행되므로이 ​​명령에 전달해야합니다.

참고os._exit()은 정리를 수행하지 않으므로 바람직하지 않습니다. 따라서 본질적으로 즉시 프로세스가 종료됩니다. 자식 스레드가 알릴 수 있도록

try: 
    # Existing Code 
except SysExit: 
    os._exit() # quit the process 
except: 
    # Existing error handling 

가 이상적으로 애플리케이션 로직이 메시지의 사용 통과 또는 유사한 무언가를해야한다 :

편집 당신이 이런 일을 할 수있는 당신의 try 블록 내에서 스크립트를 종료하려면 종료해야하는 주 스레드

+0

아니요, & 존재하지 않습니다. 나는 그것을 동기로 실행해야한다. 내가 자식 프로세스 내부에 있는지 스크립트 내에서 결정할 수있는 방법이 있습니까? 인쇄물을 출력하는 방법을 알고 있습니다. 어쨌든, os._exit()는 괜찮은 것처럼 들립니다. 지금까지는 정리 만하는 것이 아니라 프로그램 관련 자료를 의미합니까? 매번 강제로 스크립트를 반복적으로 죽이면 서버 상태가 영향을받지 않아야합니다. 맞습니까? – DaiBu

+0

자식 프로세스가 실행 중인지 확인하는 방법은 다음과 같습니다 (http://stackoverflow.com/questions/23442651/check-if-the-main-thread-is-still-alive-from-another-thread). 너는 시도 할 수 있었다. 클린업은 서버의 상태에 영향을 미치지 않아도 프로그램 특유의 물건, 버퍼 플러싱 등이 될 수 있습니다. 그것은 터미널에서'kill' 명령을 통해 프로세스를 죽이는 것과 다르지 않습니다. –

+0

글쎄,'os._exit()'를 사용해 보았는데 스크립트에서 예외 처리를 유발하는 것 같습니다. 여전히 죽지 않고 터미널에 메시지를 출력합니다. 그러나 나는 주 파일 ('sys.exit()'에서 검색 루프를 실행하는 파일에서'search_thread = Thread()'및'search_thread.start()'호출을 발견 했으므로 아마 자식 스레드 일 것입니다). 부모에게 알림을 보내고 거기서 죽일 수있는 간단한 방법이 있습니까? – DaiBu