trap指令:控制脚本之处理信号

trap指令

在脚本中遇到:
trap “exit -1” 9
所以研究下trap起到的作用
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
trap是一个shell内建命令,它用来在脚本中指定信号如何处理。

比如,按Ctrl+C会使脚本终止执行,实际上系统发送了SIGINT信号给脚本进程,SIGINT信号的默认处理方式就是退出程序。
如果要在Ctrl+C不退出程序,那么就得使用trap命令来指定一下SIGINT的处理方式了。
trap命令不仅仅处理Linux信号,还能对脚本退出(EXIT)、调试(DEBUG)、错误(ERR)、返回(RETURN)等情况指定处理方式。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
一、linux信号
信号 值 描述
1 SIGHUP 挂起进程
2 SIGINT 终止进程 (信号组合键:Ctrl+C)
3 SIGQUIT 停止进程
9 SIGKILL 无条件终止进程
15 SIGTERM 尽可能终止进程
17 SIGSTOP 无条件停止进程,但不是终止进程
18 SIGTSTP 停止或暂停进程,但不终止进程 (信号组合键:Ctr+Z)
19 SIGCONT 继续运行停止的进程

默认情况下,bash shell会忽略收到的任何SIGQUIT(3)、SIGTERM(15)信号(正因为这样,交互式shell才不会被终止)。但是bash shell会处理收到的SIGHUP(1)和SIGINT(2)信号。

shell脚本的默认行为会忽略一些信号,但捕获信号-trap命令允许你来指定shell脚本要监视并从shell中拦截的Linux信号。
trap命令的格式为:
trap commands signals。

二、trap使用示例
1.trap “echo Goodbye.” EXIT
在脚本执行完成退出时捕获,脚本执行结束后再执行“echo Goodbye”

2.trap "echo 'Sorry! I have trapped Ctrl-C“ SIGINT
脚本:
#!/bin/bash
trap “echo ‘Sorry! I have trapped Ctrl-C’” SIGINT
echo This is a test script
count=1
while [ $count -le 10 ]
do
echo "Loop c o u n t " s l e e p 1 c o u n t = count" sleep 1 count= count"sleep1count=[ $count + 1 ]
done
echo The end.

执行结果:(阻止用户通过ctrl+c生成的信号SIGINT来停止程序)
This is a test script
Loop 1
Loop 2
^CSorry! I have trapped Ctrl-C
Loop 3
Loop 4
^CSorry! I have trapped Ctrl-C
Loop 5
Loop 6
Loop 7
Loop 8
^CSorry! I have trapped Ctrl-C
Loop 9
Loop 10
The end.

3.修改trap操作
#!/bin/bash
trap “echo ‘Sorry! I have trapped Ctrl-C’” SIGINT
count=1
while [ $count -le 5 ]
do
echo "Loop c o u n t " s l e e p 1 c o u n t = count" sleep 1 count= count"sleep1count=[ $count + 1 ]
done

trap “echo ‘Sorry! The trap has been modified.’” SIGINT
count=1
while [ $count -le 5 ]
do
echo "Loop c o u n t " s l e e p 1 c o u n t = count" sleep 1 count= count"sleep1count=[ $count + 1 ]
done

执行结果:
Loop 1
Loop 2
Loop 3
^CSorry! I have trapped Ctrl-C
Loop 4
Loop 5
Loop 1
Loop 2
Loop 3
^CSorry! The trap has been modified.
Loop 4
Loop 5
The end.

4.删除捕获
命令形式为:trap – ***,例如trap – SIGINT
脚本:
。。。脚本1。。。
trap “xxx” SIGINT
。。。脚本2。。。
trap – SIGINT

执行结果:在执行脚本1的内容时,用ctrl + c组合键不会终止程序,执行到脚本2的内容时,由于删除已设置好的捕获,脚本按照默认的行为来处理SIGINT信号,则此时用ctrl+c组合键会终止脚本运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值