3. OS이야기/ 01. Administration

Linux에서 kill 명령어로 안전하게 프로세스 종료 하는 방법

OSSW(Open Source System SoftWare 2014. 8. 31. 10:08

Kill은 이벤트가 발생 했음을 프로세스에 알려 옵션에서 지정한 동작을 하게 됩니다. 

# kill -KILL(9) <pid> : 하드웨어적 종료 (가장강력)

# kill -TERM(15) <pid>: 소프트웨어적 종료 (소프트웨어에 따라 실행유무결정)

# kill -HUP(1) <pid> : 데몬의 경우 종료 후, 다시시작 (프로세스 종료가 아님, 코드 및 데이터 refresh 역할)

# kill -2 <pid> : 포그라운드에서 [ctrl] + [c] (작업취소) 를 누르는 것과 동일

# kill -3 <pid> : 포그라운드에서 [ctrl] + [\]를 누르는 것과 동일

[ctrl] + [\] : 작업취소 [ctrl] + [c]와 동일하지만 더 강력함



signal 종류 별로 signal handler 를 지정할 수 있는데 유일하게 handler 를 지정할수 없는 시그널은 SIGKILL(9), SIGSTOP(19) 두 개의 시그널입니다. 

정상적으로 작성된 프로그램이라면 종료의 의미로 사용되는 signal (INT, HUP, TERM 등)을 받으면 resource 를 정리하는 cleanup 코드를 실행하고 종료합니다. .

프로세스 종료시 kill -9 PID 를 권장하는 않는건 제대로 signal handler 를 구현한 프로그램이라도 cleanup 작업을 하지 못하고 바로 종료 될수 있습니다. 

 

이에 따라 kill -9를 실행하기 전에 먼저 kill -TERM PID 나 kill -HUP PID 같이 TERM(Termination) 나 HUP(Hangup) signal 을 사용하는 것을 권장합니다. .

위의 signal을 사용하게 되면 정상적인 프로그램은 보통 cleanup 코드를 수행하고 종료하게 되어 있습니다. 

.

Java JRE 도 TERM 이면 깨끗하게 종료되니 tomcat 이나 기타 java 관련 프로그램 종료시 KILL(9)을 먼저 보내지 말고 2~3회 정도 TERM(15) 보내는 방법을 추천합니다.. (Linux의 service 명령어도 TERM 을 보내보고 안 죽으면 KILL 을 보내게 되어 있음)


여러개의 프로세스를 종료시킬 경우 다음과 같은 awk script 를 이용해서 종료할 수 있다.

#ps -eaf Process_name | grep -v grep | awk ‘{print “kill -TERM”$2}’ | sh -x 


httpd 를 종료할 경우 다음과 같이 수행하면 된다.

#ps -eaf httpd | grep -v grep grep | awk ‘{print “kill -TERM “$2}’ | sh -x 


위의 script 를 두 세번 실행해 보고 종료가 되지 않는 process 가 있다면 SIGTERM 대신 SIGKILL 을 사용하면 됩니다. 


posted by 조경래


'3. OS이야기 > 01. Administration' 카테고리의 다른 글

[Linux] 리눅스 shutdown 명령어 사용법 및 옵션  (0) 2014.09.30
sed 사용하기  (0) 2014.09.30
rsync 설치,설정  (0) 2014.08.31
Linux - SSH root 계정 로그인 막기  (0) 2014.08.30
su 사용자 제한하기  (0) 2014.08.30