2017-01-31 1 views
3

파이썬 프로세스를 사용하여 오랫동안 실행중인 파이썬 서브 프로세스를 관리하고 있습니다. 서브 프로세스가 때때로 죽일 필요가 있습니다. kill 명령은 프로세스를 완전히 죽이지 않으며, 단지 그것을 없애 버립니다.파이썬에서 서브 프로세스를 완전히 없애는 법

다음 스크립트를 실행하면이 동작을 알 수 있습니다.

import subprocess 
p = subprocess.Popen(['sleep', '400'], stdout=subprocess.PIPE, shell=False) 

또는

p = subprocess.Popen('sleep 400', stdout=subprocess.PIPE, shell=True) 

는 하위 프로세스를 생성합니다.

p.terminate() 
p.kill() 

아무 것도 처리하지 않습니다. 이 과정이 살해되지 않은 ps aux | grep sleep

$ ps aux| grep 'sleep' 
User  8062 0.0 0.0 7292 764 pts/7 S 14:53 0:00 sleep 400 

에 의해 증명/소멸했다. subprocess.call() 함수를 'kill'pid과 함께 인수로 사용하면 kill 명령이 실행됩니다.

subprocess.call(['kill', str(p.pid)]) 

이렇게하면 프로세스가 종료되지만 현재는 작동하지 않습니다.

$ ps aux | grep 'sleep' 
User  8062 0.0 0.0  0  0 pts/7 Z+ 14:51 0:00 [sleep] <defunct> 

큐는 충분히 그것을 결국 프로세스의 최대 수에 도달합니다 실행하는 경우, 또는 결국 소멸 과정을 수확하고 잘 될 것입니다?

대답이 전자 인 경우 부모 프로세스를 죽이지 않고 파이썬에서 존재하지 않는 프로세스를 어떻게 처리 할 수 ​​있습니까?

더 좋은 방법은 없나요?

+1

'kill' 프로세스에 "신호"만 보내고 작업을 종료하도록 요청합니다. '-9 '로 죽이면 운영체제에 의해 죽습니다. 그러나 이것은 프로세스를 종료하는 나쁜 방법으로 간주됩니다. –

+0

'kill -9'는'subprocess.kill()'함수와 같은 일을합니다. 내가'p.terminate()'로 깨끗하게 종료하려고하든,'p.kill()'으로 죽이려고하든 여전히 좀비 프로세스로 끝난다. – user7495615

답변

5

여기이 주요 문제가 있습니다 :

첫 번째 문제 : shell=True을 사용하고, 그래서 당신은 프로세스를 실행하는 을 죽이는 경우가 아닌 과정 자체. 부모가 살해됨에 따라, 자식 프로세스는 사라지거나 즉시 죽지 않습니다. 귀하의 경우에는

, 당신은 실제 프로세스 ID를 얻을 것이다 내장되지 않은, 당신은 shell=True 드롭 수 있도록 sleepPopen을 사용하고 있습니다 : p.terminate()이 작동합니다.

당신은 (당신이해야한다) shell=True 그것을 함께이 명령을 파이프 입/출력을 리디렉션 노력 (코딩 추가 파이썬을 필요로하는 경우에도 시간의 대부분, 모든 경우는 잘 하나 또는 여러 Popen 에 의해 처리 될 수 피할 수

shell=True없이.

그리고 (두 번째 문제) 그 수정 후 종료 할 때 프로세스가 여전히 작동하지 않는 경우, 당신은 p.wait() (에서 this 질문)를 호출 할 수 있습니다. Popen 객체가 될 필요가있다. terminate를 호출하면 충분하지 않은 것 같다 쓰레기 수거함

+0

나는 당신의 제안을 시도했지만 정상적으로 그것을 죽이는 것이 아니라 여전히 프로세스를 zombifying 중이다. – user7495615

+0

당신은'sleep'을 시도해 보셨습니까? 지금 진짜 명령을 보여줄 수 있습니까? –

+0

질문에 게시 된 정확한 코드로 시도해보고 설명 된대로 동작합니다. – user7495615

2

자식 프로세스를 종료 한 후 p.wait()으로 전화해야합니다. 프로세스 테이블을 지우는 데 사용됩니다.그것은 좀비 프로세스를 제거해야합니다 (defunct 상태에서)

+0

감사합니다. 예, 문제가 해결되었습니다. – user7495615

+1

은 문제를 수정하므로 (예 : +1) 'shell = False' 인 경우에만 수정됩니다. –

+0

동의 함, shell = False가 필요하므로 python에 의해 생성 된 쉘이 없으므로 clone/exec을 직접 호출합니다. – VenkatC

관련 문제