참고: http://bash.cyberciti.biz/guide/Trap_statement
Trap Satement
Trap 명령을 한줄로 요약한다면, 스크립트 또는 쉘이 인터럽트를 가로채서 스크립트내에서 어떤 작업을 할 수 있도록 하는 기능을 제공한다.
스크립트를 실행중에 사용자가 Break 또는 Ctrl-C 를 눌러서 프로세스를 끝내거나, Ctrl-Z 를 눌러서 프로세스를 중단시킬 수 있다. 또한 수학적인 overflow 같은 쉘 스크립트 버그로 인하여 에러가 발생할 수도 있다.
위에서 얘기된 Ctrl-C 등의 작업이나 에러등은 시스템적인 관점에서 볼 때, 적절한 시그널을 발생시켜서 처리하게 되어있다. 하지만 이러한 시그널이 어느 시점에 발생하는지 예측할 수 없기 때문에, 예상치 못한 결과나 에러를 발생시킨다.
에러가 발생하거나 사용자가 인터럽트를 할 때마다, 시그널이 전달되는데, trap 명령은 이러한 시그널을 가로채서 미리 정의된 작업을 할 수 있도록 도와준다.
Trap 명령의 문법
trap arg signal
trap command signale
trap 'action' signal1 signal2 signalN
trap 'action' SIGINT
trap 'action' SIGTERM SIGINT SIGFPE SIGSTP
trap 'action' 15 2 8 20
뒤에 적힌 시그널이 발생하면, 해당 쉘은 action 이나 command 를 수행한다.
참고로 시그널번호는 다음과 같이 확인 할 수 있다.(ubuntu 12.04)
# 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
# less /usr/include/asm/signal.h
(생략)
...
#define SIGHUP 1
#define SIGINT 2
#define SIGQUIT 3
#define SIGILL 4
#define SIGTRAP 5
#define SIGABRT 6
#define SIGIOT 6
#define SIGBUS 7
#define SIGFPE 8
#define SIGKILL 9
#define SIGUSR1 10
#define SIGSEGV 11
#define SIGUSR2 12
#define SIGPIPE 13
#define SIGALRM 14
#define SIGTERM 15
#define SIGSTKFLT 16
#define SIGCHLD 17
#define SIGCONT 18
#define SIGSTOP 19
#define SIGTSTP 20
#define SIGTTIN 21
#define SIGTTOU 22
#define SIGURG 23
#define SIGXCPU 24
#define SIGXFSZ 25
#define SIGVTALRM 26
#define SIGPROF 27
#define SIGWINCH 28
#define SIGIO 29
#define SIGPOLL SIGIO
/*
#define SIGLOST 29
*/
#define SIGPWR 30
#define SIGSYS 31
#define SIGUNUSED 31
/* These should not be considered constants from userland. */
#define SIGRTMIN 32
#define SIGRTMAX _NSIG
...
(생략)
그 중 자주 사용되는 시그널 번호와 의미는 다음과 같다.
Number | Constant | Description | Default action | Trappable (Yes/No) |
---|---|---|---|---|
0 |
0 |
Success | Terminate the process. | Yes |
1 |
Hangup detected on controlling terminal or death of controlling process. Also, used to reload configuration files for many UNIX / Linux daemons. | Terminate the process. | Yes | |
2 |
Interrupt from keyboard (Ctrl+C) | Terminate the process. | Yes | |
3 |
Quit from keyboard (Ctrl-\. or, Ctrl-4 or, on the virtual console, the SysRq key) | Terminate the process and dump core. | Yes | |
4 |
Terminate the process and dump core. | Illegal instruction. | Yes | |
6 |
Abort signal from abort(3) - software generated. | Terminate the process and dump core. | Yes | |
8 |
Floating point exception. | Terminate the process and dump core. | Yes | |
9 |
Kill signal | Terminate the process. | No | |
15 |
Termination signal | Terminate the process. | Yes | |
20 |
Stop typed at tty (CTRL+z) | Stop the process. | Yes |
Example
<traptest.sh>
#!/bin/bash
# capture an interrupt 0
trap 'echo "Exit 0 signal detected..."' 0 1) # display something
echo "This is a test" 2) # exit shell script with 0 signal
exit 0 3)
위 쉘 스크립트를 실행하게 되면, 아래와 같은 결과를 보여준다.
# ./traptest.sh
This is a test
Exit 0 signal detected...
빨간색으로 표시된 1) trap 'echo "Exit 0 signal detected..."' 0 을 해석하면, 0 즉 exit 시그널을 받은 경우 trap 이 해당 시그널을 가로채서 'action' 인 echo "Exit 0 signal detected..." 문장을 수행하라는 뜻이다
따라서 trap 명령은 등록만 해놓은 상태에서 2)가 수행되고, 3) 이 수행되면서 trap 조건을 만족하여 1) 의 action 이 수행되는 것이다.
# type trap
trap is a shell builtin
# help trap
trap 명령의 기본 사용법 이외에 몇가지 특징을 알아보자.
1. arg / command / action 이 없거나, '-' 를 주게되면, 해당 시그널은 원래의 값으로 설정된다.
5. 시그널이 ERR 인 경우는 -e 옵션이 활성화되어 있을 때, 명령의 실패로 인하여 쉘 exit 이 발생할 때마다 arg 를 실행한다.
'IT 기술 > 프로그래밍관련' 카테고리의 다른 글
[Python] str() 과 repr() 의 차이 (3) | 2014.06.17 |
---|---|
[bash] script debugging (0) | 2013.10.11 |
[linux] openat / open 의 차이점 (0) | 2012.12.28 |
[bash] 4th - 명령행 옵션과 유형 변수 (0) | 2012.09.26 |
[bash] 3rd - 흐름제어 (0) | 2012.08.27 |