shell trap

来源:互联网 发布:麻将作弊辅助软件 编辑:程序博客网 时间:2024/04/28 02:18

trap用于捕获信号。
信号可以被应用程序或脚本捕获。并依据该信号(1 2 3 15)采取想要的行动。一些信号不能被捕获,如,一个命令收到信号9,就无法再捕获其他信号。

命令形式是:
trap name signal(s)

name是捕捉到信号后所采取的行动,常见的行动有:
1)清除临时文件、
2)忽略该信号((trap “ ” 2 3)
3)询问用户是否终止该脚本的运行。
4)举例、
signal(s)是待捕捉的信号。

举例:
vi trap1.sh
#/bin/bash
#trap1.sh
trap ‘exitprocess’ 2  捕获信号2(SIGINT),并且对信号2进行exitprocess函数的动作。
LOOP=0
Function exitprocess()
{
echo “you just hit <CTRL-C      >,at number $LOOP”
echo “I will now exit”
exit 1
}
while :     冒号代表这个循环总是为真。
do
  LOOP=$[$LOOP+1]
  echo $LOOP
  sleep 1
done

分析这个程序:
1 while循环是一个死循环,每隔一秒,echo一个递增的数,
2在./trap1.sh之后,不仅会执行死循环,而且还在开启了捕获信号,捕获信号2.
3此时再开一个命令界面。开始发送信号。:

1)先ps –aux |grep trap1.sh
2)得到trap1的进程号以后,例如是3333.运行kill –2 3333
3)原来那个命令界面会显示:
you just hit <CTRL-C      >,at number 19
I will now exit

这就是exitprocess行为的结果。
这就是trap命令捕获信号信息的用法。

Trap为两个进程之间的通信搭建了桥梁。可以利用trap来实现一个进程对另一个进程的调用。


程序运行时,遇到ctrl+C(中断信号INT)或者ctrl+\信号程序就会终止,有时不希望程序终止,希望忽略信号,或者在程序终止前进行一些清理的操作,这时会用到trap命令,它允许你控制程序的动作,当一个信号到来的时候;

kill -l可以列出系统的信号

# 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


通常我们需要忽略的信号有四个,即:HUP, INT, QUIT, TSTP,也就是信号1, 2, 3, 24 
使用这样的语句可以使这些中断信号被忽略: 
trap "" 1 2 3 24 或 trap "" HUP INT QUIT TSTP 
用 trap :1 2 3 24 或 trap HUP INT QUIT TSTP使其回复默认值。 
用stty -a可以列出中断信号与键盘的对应,分别执行上面的命令后,运行 
tail -f /etc/passwd, 然后尝试用键盘中断,试试两种情况(默认和忽略)下有何不同。 
更方便的是我们可以用在shell中用trap定义我们自己的信号处理程序


原创粉丝点击