Linux Signal
728x90

Linux에는 signal 이 있다.

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 -9 는 SIGKILL signal을 사용했다.

리눅스에는 graceful shutdown 이라는게 있는데 우아한 끝내기라는 말과 비슷하게 사이드 이펙트가 생기지 않게 끔 순서대로 코드를 정리하고 프로세스가 종료되는 것을 의미한다.

graceful shutdown vs hard shutdown


graceful shutdown 에 포함되는 shutdown 은 SIGINT, SIGTERM 이 들어가지만 SIGKILL은 graceful shutdown 과는 반대로 hard shutdown에 들어가게 된다.

graceful shutdown 과 hard shutdown의 차이점은

컴퓨터를 종료할 때 자기가 만들던 소스들을 commit하고 push 한 후 컴퓨터 종료하기 라는 버튼을 눌러서 컴퓨터를 끄는게 graceful shutdown

컴퓨터를 종료할 때 그냥 본체에 있는 종료 버튼을 꾹 눌러 강제 종료 하는게 hard shutdown 이다.

그래서 이제까지 했던 모든 작업을 잃게 된다.

추천


리눅스에서 kill 을 할 때 -9 옵션 보다 -15 옵션을 사용하는 것을 권장한다.

grails 는 제외이다. <= 얘는 15 옵션 줘도 않죽기 때문에 -9을 사용하는게 낫다.

script 에서 사용하기


shell script 에서는 trap 을 넣어주면 된다.

SIGINT 는 사용자가 Ctrl + C 를 눌렀을 때 종료하는 것이고,

SIGTERM 은 선언이 되면 종료가 된다.

그리고 trap에서 안먹는 시그널이 있는데 SIGKILL 이다.

#!/bin/sh

trap <commands> <signals>

ex) trap 'tail -f /var/log/log.log' SIGTERM
번호 시그널 기능
1 SIGHUP 프로세스를 끊음
2 SIGINT 프로세스 중지
3 SIGQUIT 프로세스 중단
9 SIGKILL 무조건 프로세스 종료
15 SIGTERM 가능하면 프로세스를 종료
17 SIGSTOP 무조건 프로세스를 중단(종료 X)
18 SIGTSTP 프로세스 중단 또는 일시 중지(종료 X)
19 SIGCONT 중단된 프로세스를 실행

test 해보기

test script 1

#!/bin/sh


trap 'echo "Exit 0 signal term ..."' 0

echo "This is a test"

#tail -f /usr/local/tomcat7/logs/catalina.out


tail $HOME/test2.log -n0 -F | while read line
do
        if [[ $line =~ 'INFO: Server startup in' ]];then
                pkill -9 -P $$ tail
        fi
done;

exit 0

test script 2

#!/bin/sh




for var in {1..10}
do
  echo 'test:testtesttest' | tee -a $HOME/test2.log
  sleep 1
done

echo 'INFO: Server startup in 141579 ms' | sudo tee -a $HOME/test2.log


exit 0

test 1 스크립트는 tail을 걸고 정규식으로 tomcat 이 성공적으로 올라갔다는 로그 INFO: Server startup in 142341ms

라는 로그를 발견하면 프로세스 kill 하는 명령어를 적어 놓는다. (서버에 치명적인 영향을 주지 않기 때문에 tail은 어차피 -9 사용해도 된다.)

test 2 스크립트는 test2.log 파일에 10번 'test:testtesttest' 라는 로그를 쌓다가 for문을 나온다음 마지막에 'INFO: Server startup in 142341ms' 라는 명령어를 쌓고 종료된다.

test 시작

먼저 test 1 script 를 실행 시켜 놓으면 tail 명령어로 인해 계속해서 대기 상태가 된다.

그 다음에

test 2 script 를 실행 시킨다.

test2 마지막 쯤에

이렇게 INFO: Server startup in 141579 ms 가 나오면

종료되면서 끝이난다.

728x90

'OS > Linux' 카테고리의 다른 글

OS 입출력  (0) 2023.05.16
Linux 스케줄러  (0) 2022.11.04
리눅스 명령어 정리 중..  (0) 2022.07.25
Linux (CentOS 6) 서비스 등록  (0) 2022.07.25
로그파일 시간 별로 추출하기  (0) 2022.06.24