기본적으로 사용하는 프로세스 킬 명령은 아래와 같습니다
kill -- -$PGID
Use default signal (TERM
= 15)
kill -9 -$PGID
Use the signal KILL
(9)
호스팅 시스템을 운영하다보면은 데몬의 오류라던지, 프로세스상의 문제가 있어
/usr/local/apache/bin/apachectl stop 명령을 했을 경우 모든 프로세스가 종료되지 않고 남아 있는 경우가 있습니다
이럴 경우 pkill, 또는 killall 등을 이용해서 프로세스를 죽여도 되지만 해당 명령어로도 프로세스가 죽지 않으면
kill PID 형태로 하나씩 프로세스를 죽여줘야 합니다 1~2개의 프로세스면 쉽게 처리할 수 있지만 프로세스가 100개 정도 될때에는
하나씩 삭제를 할수 없기 때문에 아래와 같이 grep 및 awk 등을 사용하시면 쉽게 프로세스를 정리할 수 있습니다
예) kill -9 `ps -ef |grep httpd
아래는 참고 사항 입니다
|
Kill all the processes belonging to the same process tree using the Process Group ID (PGID )
kill -- -$PGID Use default signal (TERM = 15)
kill -9 -$PGID Use the signal KILL (9)
You can retrieve the PGID from any Process-ID (PID ) of the same process tree
kill -- -$(ps -o pgid= $PID | grep -o '[0-9]*') (signal TERM )
kill -9 -$(ps -o pgid= $PID | grep -o '[0-9]*') (signal KILL )
Special thanks to tanager and Speakus for contributions on $PID remaining spaces and OSX compatibility.
Explanation
kill -9 -"$PGID" => Send signal 9 (KILL ) to all child, grandchild…
PGID=$(ps opgid= "$PID") => Retrieve the Process-Group-ID from any Process-ID of the tree, not only the Process-Parent-ID. A variation of ps opgid= $PID is ps -o pgid --no-headers $PID where pgid can be replaced by pgrp . But:
ps inserts leading spaces when PID is less than five digits and right aligned as noticed by tanager. You can use:
PGID=$(ps opgid= "$PID" | tr -d ' ')
ps from OSX always print the header, therefore Speakus proposes:
PGID="$( ps -o pgid "$PID" | grep [0-9] | tr -d ' ' )"
|