본문 바로가기
IT 기술/프로그래밍관련

[bash] 5th - Trap Statement

by 땅뚱 2013. 8. 1.

참고: 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

SIGHUP

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

SIGINT

Interrupt from keyboard (Ctrl+C) Terminate the process. Yes

3

SIGQUIT

Quit from keyboard (Ctrl-\. or, Ctrl-4 or, on the virtual console, the SysRq key) Terminate the process and dump core. Yes

4

SIGILL

Terminate the process and dump core. Illegal instruction. Yes

6

SIGABRT

Abort signal from abort(3) - software generated. Terminate the process and dump core. Yes

8

SIGFPE

Floating point exception. Terminate the process and dump core. Yes

9

SIGKILL

Kill signal Terminate the process. No

15

SIGTERM

Termination signal Terminate the process. Yes

20

SIGSTP

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

type 명령의 결과로 알 수 있듯이 trap 은 shell builtin 명령어이고, 그 사용법은 help 명령을 사용해서 확인할 수 있다.
# help trap

trap 명령의 기본 사용법 이외에 몇가지 특징을 알아보자.

 

1. arg / command / action 이 없거나, '-' 를 주게되면, 해당 시그널은 원래의 값으로 설정된다.

2. 시그널이 0(exit)인 경우는 위 예제에서 설명했다. Exit 되는 경우 arg 가 수행된다.
3. 시그널이 DEBUG 인 경우에는 모든 command 가 실행되기 전에 arg 가 수행된다.
4. 시그널이 RETURN 인 경우에는 쉘 함수 또는 . 이나 source 에 의해서 수행되는 스크립트가 끝날때마다 arg 가 수행된다.

5. 시그널이 ERR 인 경우는 -e 옵션이 활성화되어 있을 때, 명령의 실패로 인하여 쉘 exit 이 발생할 때마다 arg 를 실행한다.