최상단

컨텐츠

[Tip] 스크립트에서 Signal을 제어하자~!

글 정보

Category
컴퓨터 이야기
2007. 7. 16. 16:49

본문

쉘스크립트에서 tcpdump를 실행시키고.....
사용자가 Ctrl + C 로 tcpdump를 중지하면..
그때까지의 결과를 저장하고 프로그램을 종료하는 간단한 스크립트를 작성해야했다.
하지만 사용자가 Ctrl + C를 누르게 되면.....tcpdump가 종료되는 동시에
그 시그널이 shell까지 전달되어 쉘스크립트까지 멈추는 현상이 발생하였다.
이를 해결하기 위해 찾아낸 것이 trap이라는 명령어이다..
단, 이 trap라는 명령어는 bash shell의 내부명령어로 다른 쉘을 사용할 경우에는 사용할 수 없다.

trap의 사용방법은

# trap '실행하고자하는 명령어' 시그널번호

이다... 스크립트 안에서만 사용할 수 있는 것이 아니라
너무나도 당연히 command line에서도 사용할 수 있다.

[dev@bamboo dev]$ trap 'ls -l' INT
[dev@bamboo dev]$ '여기에서 Ctrl+C'를 입력해본다.total 1458240
-rw-rw-r--    1 dev      users        5184 Oct 27  2006 !
drwxrwxr-x    3 dev      users        4096 Jan 22 09:53 0122
-rw-r--r--    1 dev      users      699612 May 25 10:13 070226_av.avi
-r-xr-xr-x    1 dev      users       20319 Jan 11  2007 0_name.gram.class
-rw-rw-r--    1 dev      users     1034240 Jun  5 14:09 1234.cap
-rw-r--r--    1 dev      users        7375 Dec 12  2003 문서1.htm
-rw-r--r--    1 dev      users        4176 Apr  1  2006 324M_CONFIG.ini
-rw-rw-r--    1 dev      users    112282760 Mar 11  2005 500000_rx.txt
-rw-rw-r--    1 dev      users    112274003 Mar 11  2005 500000_tx.txt

# trap 'ls -l' INT
라고 명령을 내리게 되면... 바로 리턴되게 된다.
대신 INT시그널이 들어오게 되면 ls -l 이라는 명령어가 실행되도록
shell이 기억하게 된다.
그 이후 Ctrl+C(INT)가 입력되면 당연히 ls -l 명령이 실행되게 된다.



trap을 통해 INT시그널을 가로채게 되면
위에서 언급했던 문제가 해결된다.(tcpdump와 스크립트가 함께 종료되는 현상)
# trap '' INT 를 통해 해당 시그널을 무시하면 스크립트 다음 줄이 실행된다.ㅎ



------------------------------------------------------------------------
시그널의 종류는 아래와 같이
# kill -l
명령을 통해서 알수 있다.

[dino@thedino-~]$ kill -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL
 5) SIGTRAP      6) SIGABRT      7) SIGEMT       8) SIGFPE
 9) SIGKILL     10) SIGBUS      11) SIGSEGV     12) SIGSYS
13) SIGPIPE     14) SIGALRM     15) SIGTERM     16) SIGURG
17) SIGSTOP     18) SIGTSTP     19) SIGCONT     20) SIGCHLD
21) SIGTTIN     22) SIGTTOU     23) SIGIO       24) SIGXCPU
25) SIGXFSZ     26) SIGVTALRM   27) SIGPROF     28) SIGWINCH
29) SIGLOST     30) SIGUSR1     31) SIGUSR2     32) SIGRTMAX
[dino@thedino-~]$

참고자료 :
http://kldp.org/HOWTO/html/Adv-Bash-Scr-HOWTO/debugging.html

트랙백과 댓글 여닫기

TOP