LINUX
2016.11.03 / 10:16

Unix, Linux ¿¡¼­ kill ¸í·É¾î·Î ¾ÈÀüÇÏ°Ô ÇÁ·Î¼¼½º Á¾·á ½ÃÅ°´Â ¹æ¹ý

±â¸®¾Æºü
Ãßõ ¼ö 189

½Ã½ºÅÛ ÀÛ¾÷ÇÏ´ø Á÷¿øÀÌ java °ü·Ã ÇÁ·Î¼¼½º Á¾·á¸¦ kill -9 PID ¸¦ ÇÏ´Â °ÍÀ» º¸°í ÀǾÆÇؼ­ ¹°¾îº¸´Ï ´ç¿¬È÷ ±×·¸°Ô ÇÏ´Â °É·Î ¾Ë°í ÀÖ¾ú´Ù.

 

°Ë»öÀ» ÇØ º¸´Ï °ÅÀÇ ¸ðµç ºí·Î±×°¡ ÇÁ·Î¼¼½º Á¾·á¸¦ -9 signal ·Î ó¸®Ç϶ó°í µÇ¾î À־ kill ¸í·ÉÀÇ ÀÇ¹Ì ¹× ¾ÈÀüÇÏ°Ô ÇÁ·Î¼¼½º Á¾·á ÇÏ´Â ¹ýÀ» Á¤¸®ÇØ º»´Ù.

 

kill Àº ¿ëµµ¿¡ ¸ÂÁö ¾Ê°Ô À̸§ÀÌ Áö¾îÁø ¸í·É¾îÁßÀÇ ÇϳªÀÌ´Ù. ÁÖ¿ä ¿ëµµ´Â event °¡ ¹ß»ýÇßÀ½À» ÇÁ·Î¼¼½º¿¡°Ô ¾Ë¸®´Â °ÍÀÌ´Ù. signal ÀÇ Á¾·ù´Â /usr/include/signal,h ¿¡ Á¤¸®µÇ¾î ÀÖ´Ù. (½ÇÁ¦ ¼±¾ðºÎ´Â OS ÀÇ Á¾·ù¿¡ µû¶ó signal.h ¿¡¼­ º°µµ·Î include ÇÒ ¼öµµ ÀÖ´Ù)


Un*x ´Â ÇÁ·Î±×·¥¿¡¼­ signal Á¾·ù º°·Î signal handler ¸¦ ÁöÁ¤ÇÒ ¼ö Àִµ¥ À¯ÀÏÇÏ°Ô handler ¸¦ ÁöÁ¤ÇÒ¼ö ¾ø´Â ½Ã±×³ÎÀº SIGKILL(9), SIGSTOP(19) µÎ °³ÀÇ ½Ã±×³ÎÀÌ´Ù.

Á¦´ë·Î ±¸ÇöÇÑ ÇÁ·Î±×·¥À̶ó¸é Á¾·áÀÇ Àǹ̷Π»ç¿ëµÇ´Â signal (INT, HUP, TERM µî)À» ¹ÞÀ¸¸é resource ¸¦ Á¤¸®ÇÏ´Â cleanup Äڵ带 ½ÇÇàÇÏ°í Á¾·áÇÏ°Ô µÇ¾î ÀÖÀ» °ÍÀÌ´Ù.

ÇÁ·Î¼¼½º Á¾·á½Ã kill -9 PID ¸¦ ±ÇÀåÇÏ´Â ¾Ê´Â°Ç Á¦´ë·Î signal handler ¸¦ ±¸ÇöÇÑ ÇÁ·Î±×·¥ÀÌ¶óµµ cleanup ÀÛ¾÷À» ÇÏÁö ¸øÇÏ°í ¹Ù·Î Á¾·áµÇ¾î ¹ö¸±¼ö Àֱ⠶§¹®ÀÌ´Ù.

 

°³ÀÎÀûÀ¸·Î ÃßõÇÏ´Â ¹æ¹ýÀº ¸ÕÀú kill -TERM PID ³ª kill -HUP PID °°ÀÌ TERM(Termination) ³ª HUP(Hangup) signal À» ³¯¸®´Â °ÍÀÌ´Ù.

À§ÀÇ signalÀ» ³¯¸®¸é Á¦´ë·Î µÈ ÇÁ·Î±×·¥Àº º¸Åë cleanup Äڵ带 ¼öÇàÇÏ°í Á¾·áÇÏ°Ô ±¸ÇöµÇ¾î ÀÖ´Ù.

Java JRE µµ TERM ÀÌ¸é ±ú²ýÇÏ°Ô Á¾·áµÇ´Ï tomcat À̳ª ±âŸ java °ü·Ã ÇÁ·Î±×·¥ Á¾·á½Ã KILL(9)À» ¸ÕÀú º¸³»Áö ¸»°í µÎ ¼¼¹ø Á¤µµ 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|awk '{print "kill -TERM "$2}' | sh -x

À§ÀÇ script ¸¦ µÎ ¼¼¹ø ½ÇÇàÇØ º¸°í Á¾·á°¡ µÇÁö ¾Ê´Â process °¡ ÀÖ´Ù¸é SIGTERM ´ë½Å SIGKILL À» »ç¿ëÇÏ¸é µÈ´Ù.

 

¸ðµç child process ±îÁö Á¾·á½ÃÅ°´Â ½ºÅ©¸³Æ®°¡ ÇÊ¿äÇÏ´Ù¸é StackOverflowÀÇ Best way to kill all child processes ¾²·¹µå¸¦ ÂüÁ¶ÇÏÀÚ.

À§ ¾²·¹µå¿¡¼­ ¹ßÃéÇÑ killtree.sh
#!/bin/bash
 
killtree() {
    local _pid=$1
    local _sig=${2:-TERM}
    kill -stop ${_pid} # needed to stop quickly forking parent from producing child between child killing and parent killing
    for _child in $(ps -o pid --no-headers --ppid ${_pid}); do
        killtree ${_child} ${_sig}
    done
    kill -${_sig} ${_pid}
}
 
if [ $# -eq 0 -o $# -gt 2 ]; then
    echo "Usage: $(basename $0) <pid> [signal]"
    exit 1
fi
 
killtree $@