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 가 나오면
종료되면서 끝이난다.
'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 |
Comment