Monthly Archives: May 2014

Linux #26 : Process 종료 및 그에 따른 간단한 설명

Linux System을 운영하다보면 특정 Process를 죽이기 위해 “kill” command를 사용하는 경우가 있죠. “/etc/init.d/” 안에 Control Lib Script로 등록되는 일반적인 Process는 비정상적인 경우가 아니면 “kill”을 사용할 필요가 없는데 경우에 따라서 “kill”을 통해서 Process를 죽여할 때가 있습니다.

시작은 어떤 Process를 죽여야하고 그 Process의 pid(Process ID)가 무엇인지를 확인하는게 필요하죠.

# ps ax
PID TTY STAT TIME COMMAND
1 ? Ss 2:51 init [3]
2 ? S 0:00 [kthreadd]
3 ? S 0:43 [migration/0]
4 ? S 0:16 [ksoftirqd/0]
5 ? S 0:36 [migration/1]
19331 ? Sl 3:57 /sbin/rsyslogd -c5
22222 ? S 1111:11 /usr/local/sbin/proftpd
22560 tty1 Ss+ 0:00 /sbin/mingetty --long-hostname tty1
23384 ? S 0:00 /usr/local/apache2/bin/httpd -k restart
24406 ? S 0:05 /usr/local/apache2/bin/httpd -k restart
24605 ? Ss 2:20 /usr/local/apache2/bin/httpd -k restart
25081 ? S 0:00 /usr/local/apache2/bin/httpd -k restart

“ps ax” command를 통해서 확인하면 대충 이렇겠죠. “ps -elf”라고 입력하면 더 많은 정보가 나옵니다. “ps”에 대해서는 다음시간에 더 자세히 다루도록 하구요.

예로 proftpd daemon을 죽일예정이고,

# ps ax | grep proftpd
22222 ? S 1111:11 /usr/local/sbin/proftpd
..

이런 식으로 표시가 되겠죠. 그리고, pid가 22222 인걸 알 수 있죠. 기본적으로 “kill [pid]”와 같이 실행을 하게 되는데 default로 -TERM이 지정되게 됩니다. 즉

# kill -TERM 22222 = kill 22222

와 같은 것이죠. 여기서 TERM은 Terminate 입니다. “kill” command에서 지정 가능한 Signal은 여러 종류가 있습니다. “-l” option을 지정하면 볼 수 있는데,

# kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE
9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT
17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU
25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH
29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN
35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4
39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12
47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6
59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX

이렇게나 많아요. 실제 “kill”에서 사용할 때는 앞의 SIG를 제외하고 예를 들면 1) SIGHUP는 HUP(Hang UP), 2) SIGINT는 INT(Initial) 으로 처리하게 됩니다.
많이 쓰는 건 앞에서 말씀드린 15) SIGTERM 이네요. Default이기도 하고

따라서, 좀 전에 22222 PID를 “kill” 하면 아래와 같이,

#kill -TERM 22222 or kill 22222
[1]+ TErminated /usr/local/sbin/proftpd

와 비슷하게 처리가 될 겁니다. 그런데, “kill” command로 죽일 수 없는 Processs들을 언젠가 만나실 수 있는데 Zombie Process라고도 합니다. 이런 Process들을 죽이려면 때로는 System을 Reboot 해야하는 경우도 있죠. Process의 Status는 위에 “ps ax”의 option 중 “a”가 추가 되었을 때 확인 가능합니다.

# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 10356 476 ? Ss Apr07 2:51 init [3]
root 2 0.0 0.0 0 0 ? S Apr07 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S Apr07 0:43 [migration/0]
root 4 0.0 0.0 0 0 ? S Apr07 0:16 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S Apr07 0:36 [migration/1]
root 6 0.0 0.0 0 0 ? S Apr07 0:17 [ksoftirqd/1]
..
www 23384 0.0 0.0 219396 8316 ? S 06:08 0:00 /usr/local/apache2/bin/httpd -k restart
www 24406 0.0 0.1 225404 18756 ? S May27 0:05 /usr/local/apache2/bin/httpd -k restart
root 24605 0.0 0.0 219264 11172 ? Ss Apr11 2:20 /usr/local/apache2/bin/httpd -k restart
www 25081 0.0 0.0 219528 9588 ? S 05:42 0:00 /usr/local/apache2/bin/httpd -k restart

좀 더 자세하게 볼 수 있도록 “u” option을 더 추가했습니다.

Process의 Status Code를 설명 해 드리면,

PROCESS STATE CODES
Here are the different values that the s, stat and state output specifiers (header "STAT" or "S") will display to describe the state of a
process.
D Uninterruptible sleep (usually IO)
R Running or runnable (on run queue)
S Interruptible sleep (waiting for an event to complete)
T Stopped, either by a job control signal or because it is being traced.
W paging (not valid since the 2.6.xx kernel)
X dead (should never be seen)
Z Defunct ("zombie") process, terminated but not reaped by its parent.

For BSD formats and when the stat keyword is used, additional characters may be displayed:
< high-priority (not nice to other users)
N low-priority (nice to other users)
L has pages locked into memory (for real-time and custom IO)
s is a session leader
l is multi-threaded (using CLONE_THREAD, like NPTL pthreads do)
+ is in the foreground process group

아참 꼭 “man” command를 통해 Linux 일반적인 command들의 내용을 참조하는 습관을 기르세요. 최고의 Guide라고 생각이 들어요. 아래 따로 설명을 드렸지만 위 Man page의 내용을 보면 사실 필요없지 않나 생각이 드네요.

D : IO 순번을 기다리는 상태
R : 실행 중
S : 대기 중
T : 중단 중
W : Swapout 된 상태
X : 죽은 상태
Z : Zombie

< : 높은 우선 순위로 실행 중
N : 낮은 우선 순위로 실행 중
L : Real Time 처리 등으로 메모리내에 고정 되어 실행 중 등등

여기서 Zombie는 CPU Time은 소비하지 않는데, Physical Memory나 Swap Memory를 사용하고 있는 경우가 있습니다. 따라서, 계속 늘어나게 된다면 Memory Leak이 발생을 하겠지요.
간단하지만, 알아두면 좋을 듯 하네요.

Linux #25 : Shutdown Command의 Risk를 줄이는 방법

Linux를 운영하다 보면 Shutdown을 해야 하는 경우가 있고 별 생각없이 shutdown -h now를 날리는 경우가 많이 있습니다. 아차하고 생각하는 찰나에 Console 창을 잘 못 골라 다른 서버이구나 싶으면 정말 울고 싶겠죠.

이런 상황을 일단 만들지 않도록 Double-Check을 하는게 굉장히 중요하지만, 사람이라는게 실수를 하는지라 좋은 Command 습관을 기른다면 이런 상황을 좀 더 여유롭게 대처 할 수 있겠지요.

일단 Shutdown Command는 Root에서만 가능하므로 Root를 획득해야 하는 건 당연한데 일반 User Account로 Shutdown 날리는 모습은 다른 사람들에게 보여주지는 맙시다. 🙂
그럼, shutdown -h now에서 해방이 되기 위해서는 now를 추가하는 습관을 과감히 버려야 합니다. 당장 Shutdown을 하고 싶겠지만, High Priority Server 일 수록 계획적이고 여유를 가지고 Shutdown을 날리는게 좋겠지요. Now 대신 아래와 같이 Time을 지정합니다.

# shutdown -h +15
or
# shutdown -h 0:15

Guide)
[hour:min] : 시간과 분은 2 Digits의 수치를 지정 할 수 있습니다. 예를 들어서 지금부터 1시간 30분후에 Shutdown 하고 싶으면 "shutdown -h 01:15"라고 입력하면 됩니다.
[+min] : 지정한 몇분 이후에 Shutdown이 되겠지요. 앞에서 설명 했던 것 처럼 15분의 경우 "shutdown -h +15" 입니다.

이렇게 하면 15분 후에 Shutdown이 시작되게 되고 혹시 잘 못 날린 Shutdown Command라면 대처할 시간적인 여유를 갖게 되겠지요.

이제, 이런 Shutdown까지 시간적인 여유가 생긴 상황에서 혹시 무언가 문제가 있다는 것을 발견하고 Shutdown을 중지 할 수 있는 기회가 있고, 충분한 시간적인 여유가 있다면 High Priority Server이면 일수록 행복한 상황일 것입니다.

그럼, Shutdown을 어떻게 중지 시켜야 할까요?
Shutdown이라고 하는게 shutdown command에 의해서 활성화가 됨으로 “shutdown -h +15″와 같이 Command를 날리고 15분이 지나기 전까지는 이 Command만 활성화 되어 있겠죠.
결과적으로 Shutdown command를 kill command로 내리면 됩니다.

"ps ax"라는 command로 process를 확인 하면 "shutdown -h +15"를 보실 수 있지요.
# ps ax
PID TT STAT TIME COMMAND
...
1745 ?? S<s 0:00.00 shutdown -h +15
1749 p0 R+ 0:00.00 ps ax
...

# ps ax | grep shutdown | sed -e 's/^ * //' | cut -d ' ' -f 1
이 Command의 목적은 PID 값을 호출하는 것이고, 즉 Kill과 같이 사용하면

# kill `ps ax | grep shutdown | sed -e 's/^ * //' | cut -d ' ' -f 1`
Kill [PID]가 실행 된 이후

# ps ax | grep shutdown

으로 "shutdown -h +15" Command가 정상적으로 Killed 되었는지를 확인 하시면 됩니다.

추가로, “wall” command로 Shutdown 전 Login하고 있는 모든 User에게 Message를 보내거나, 사전에 /etc/motd를 수정해서 여기서 motd는 Message of the day라는 건 아시죠.
사전에 Shutdown Schedule을 공유 하는 것도 System Operation에 좋은 배려라고 볼 수 있습니다.