프로세스 kill 에 대하여
글쓴이: yi0218 / 작성시간: 수, 2004/10/13 - 5:36오후
부모 프로세스가 여러개의 차일드 프로세스 내지는 다수의 스레드를 생성할때
생성한 프로세스(스레드)가 경우에 따라서 데드락 상태가 되는 경우가 있습니다.
이때 부모프로세스에게 KILL -9 시그널을 보내면 모든 차일드 프로세스와 함께
종료되는 것이 정상인데(본인이 알기론...), 종료 되지 아니하고 부모프로세스가
좀비로 남고 자식은 계속 데드락 상태로 남아있게 되는 경우가 종종 있습니다.
결국 직접 차일드 프로세스를 찾아 kill -9 시그널을 보내야 되는데,
부모에게(부모가 생성한 프로세스와 함께) kill -9 시그널을 재귀적으로 모든 자식에게 보내는 방법이 있을런지... 알고 싶습니다.
Forums:
부모가 자식을 생성할때 자식의 PID를 알수 있습니다.fork 할때
부모가 자식을 생성할때 자식의 PID를 알수 있습니다.
fork 할때 이때 딱 한번만 알수 있습니다.
따라서 부모가 자식낳을때(fork할때)
자식 프로세스의 PID를 저장해두었다가
나중에 루프돌면서 kill 해주시면 될것 같네요
또 wait 모든 자식넘들이 종료되기를 기다릴수도 있구요
질문 추가...
부모가 자식을 생성할때 하나의 프로세스를 생성하지만
이 자식프로세스가 또다른 자식프로세스(스레드)를 만들기 때문에
자식의 PID는 알 수 있지만 손자 이상의 PID는 알 수 없으며,
자식 프로세스가 외부프로그램을 fork해서 수행하게 되면
이 프로세스의 이름도 알 수 없습니다.
이때는 이 외부 프로그램이 실로 몇개의 프로세스나 스레드를 만드는지
알 수 없으므로 더 곤란 하게 만듭니다.
그리고 자식 프로세스가 데드락 상태라면 wait 하면서 기다릴 수 없으므로
무한히 기다리는 현상이 발생하게 되는것 입니다.
그러므로, 프로세스 트리 구조로 볼 때 부모 프로세스로 부터
모든 자식 프로세스를 재귀적으로 KILL 할 수 있는 방법을 찾고 있습니다.
kill -9 는 SIGKILL 로 catchable 되거나 ignora
kill -9 는 SIGKILL 로 catchable 되거나 ignorable 되지 않습니다. 고로 다른 시그널은 블락되고 SIGKILL 만 부모에게 먹히는 상황이라면 부모는 자식에게 SIGKILL을 전달하지 못하고 그자리에서 죽어버립니다. 한마디로 부모와 자식을 전부 SIGKILL 할수 없습니다.
만약 자식만 SIGKILL 시그널로 보내고 부모는 SIGINT, SIGQUIT 정도로 한다면 얘기가 됩니다.
다른분들의 답변처럼 자식의 PID를 저장하고 시그널핸들에서 자식들에게 개별적으로 시그널을 보내는 루틴으로 처리, 다음 부모 자살? 하기... 뭐 이런순이죠.
정 안되는 상황이라면 스크립트를 작성해서 같은 이름의 모든프로세스(부모,자식) 에게 kill -9 를 보내는 방법도 있겠죠.. perl 같은것으로 짠다면 간단하게 될껍니다.
목적을 찾아서... jiNoos
그냥 제 생각입니다만.. 시그널 핸들러를 사용하는 방법은 안될지..
그냥 제 생각입니다만.. 시그널 핸들러를 사용하는 방법은 안될지..
Re: 질문 추가...
재귀적으로 KILL 할 필요가 있을까 하는데 의문이 듭니다. 어차피 KILL -9 는 처리 되지 않고 즉사! 하기에 순서가 그리 중요하지 않다면.. 급조해서..
$ pkill process_name
목적을 찾아서... jiNoos
재귀적으로 생성할때마다 reculsive한 구조로 PID를 저장하세요..
재귀적으로 생성할때마다 reculsive한 구조로 PID를 저장하세요.. 위의 Jinoos님 말씀대로 kill PID로 SIGINT를 발생시키고, 이때 코딩내에서 reculive하게 루프돌면서 lastorder방식으로 process를 kill하시면 될듯
댓글 달기