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定义我们自己的信号处理程序