Bash脚本可以通过在脚本中添加trap命令来捕获执行中收到的信号,并且trap后面可以指定收到信号后的操作:trap commonds signals
注:感觉类似一个钩子,捕获信号然后按照既定的操作执行。
示例:
1、捕获Ctrl+C命令,捕获到后,直接打印信息,并不退出脚本的执行:
#!/bin/bash
trap "echo 'Sorry, recv trappedCtrl-C'" SIGINT SIGTERM
echo "This is a test program"
cnt=1
while [ $cnt -le 5 ]
do
echo "loop #$cnt"
cnt=$[ $cnt + 1 ]
sleep 5
done
echo "this is the end of the testprogram"
执行结果:
[root@localhost bash-files]# ./tmp-trap.sh
This is a test program
loop #1
loop #2
Sorry, recv trapped Ctrl-C
loop #3
loop #4
Sorry, recv trapped Ctrl-C
loop #5
this is the end of the test program
2、捕获捕获脚本的退出
#!/bin/bash
trap "echo 'recv EXIT signal,byebye'" EXIT
echo "test program begin:"
cnt=1
while [ $cnt -le 5 ]
do
echo "loop #$cnt"
((cnt++))
sleep 5
done
echo "test program end!"
执行结果:
[root@localhost bash-files]#./tmp-trap-exit.sh
test program begin:
loop #1
loop #2
loop #3
recv EXIT signal, byebye
注:这里直接在循环到3后,用Ctrl+C终止了脚本的执行;
下面是让脚本正常执行结束的结果,也会触发EXIT消息:
[root@localhost bash-files]#./tmp-trap-exit.sh
test program begin:
loop #1
loop #2
loop #3
loop #4
loop #5
test program end!
recv EXIT signal, byebye
3、移除要捕获的信号:
可以通过trap后跟一个中划线’-‘,再跟要移除的信号,来移除信号。移除后,将不再捕获该信号:
在上面捕获EXIT的代码中,如果在循环执行完毕后,添加trap – EXIT,那么再退出时,就不会捕获EXIT信号了:
#!/bin/bash
trap "echo 'recv EXIT signal,byebye'" EXIT
echo "test program begin:"
cnt=1
while [ $cnt -le 5 ]
do
echo "loop #$cnt"
((cnt++))
sleep 5
done
trap - EXIT
echo "test program end!"
这个代码只捕获在脚本运行中收到的EXIT信号。