파이썬 프로세스를 사용하여 오랫동안 실행중인 파이썬 서브 프로세스를 관리하고 있습니다. 서브 프로세스가 때때로 죽일 필요가 있습니다. 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>
큐는 충분히 그것을 결국 프로세스의 최대 수에 도달합니다 실행하는 경우, 또는 결국 소멸 과정을 수확하고 잘 될 것입니다?
대답이 전자 인 경우 부모 프로세스를 죽이지 않고 파이썬에서 존재하지 않는 프로세스를 어떻게 처리 할 수 있습니까?
더 좋은 방법은 없나요?
'kill' 프로세스에 "신호"만 보내고 작업을 종료하도록 요청합니다. '-9 '로 죽이면 운영체제에 의해 죽습니다. 그러나 이것은 프로세스를 종료하는 나쁜 방법으로 간주됩니다. –
'kill -9'는'subprocess.kill()'함수와 같은 일을합니다. 내가'p.terminate()'로 깨끗하게 종료하려고하든,'p.kill()'으로 죽이려고하든 여전히 좀비 프로세스로 끝난다. – user7495615