trap信号捕捉详解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了trap信号捕捉详解相关的知识,希望对你有一定的参考价值。

<--目录-->

1)trap介绍

2)trap信号列表

3)trap使用例子

4)测试INT(2)信号

5)同时测试多个信号

6)shell跳板机案例


【trap介绍】

通过trap命令用于指定在接收到信号后要采取的行动;trap命令的一种常见用途是在脚本程序被中断时完成清理工作,历吏上,shell总是用数字来代表信号


【trap信号列表】

下面列出一些比较重要的信号(括号里面的数字是传统的信号编号)

信号          说明 

HUP(1)      挂起,通常因终端掉线或用户退出而引发 

INT(2)      中断,通常因按下Crtl+C组合健而引发                 

QUIT(3)     退出,通常因某些严重的执行错误而引发         

ABRT(6)     中止,通常因某些严重的执行错误而引发         

ALRM(14)    报警,通常用来处理超时 |

TERM(15)    终止,通常在系统关机时发送 

TSTP(20)    停止进程的运行,但该信号可以被处理和忽略,用户健入SUSP字符时(通常是Ctrl-Z)发出这个信号



【trap使用例子】

通常我们需要忽略的信号有HUP INT QUIT TSTP TERM,也就是信号1,2,3,20,15使用下面的语句可以使这些中断信号被忽略

trap命令的参数分为两部分,前一部分是接收到指定信号时将要采取的行动,后一部分是要处理的信号名,如下例子:

########################

# trap command signal  #

########################

signal是指收到的信号,command是指接收该信号采取的行动,如下为两种简单的信号

######################################################################################################

# trap "command(要执行的动作命令)" 1 2 3 20 15 或 trap "command(要执行的动作命令)" HUP INT QUIT TSTP #

######################################################################################################



【测试INT(2)信号】

[[email protected] ~]# trap "" 2     <== 屏蔽Ctrl+C信号,""引号里面为空,就是说你按了Crtl+C后,不做任何动作,相当于屏蔽了Ctrl+C

[[email protected] ~]# 此时无法执行Ctrl+C

[[email protected] ~]# trap ":" 2    <== 恢复ctrl+c信号

[[email protected] ~]# ^C            <== 此时可以执行Crtl+C了

[[email protected] ~]# trap "echo -n ‘you are typing ctrl+c‘" 2  <== 按了Ctrl+C后接受到2的信号就会输出双引号里面的内容

[[email protected] ~]# ^Cyou are typing ctrl+c

[[email protected] ~]# ^Cyou are typing ctrl+c

[[email protected] ~]# ^Cyou are typing ctrl+c

[[email protected] ~]# trap ":" 2    <== 再还原本样Ctrl+C信号

[[email protected] ~]# ^C            <== 此时再按Crtl+C变成原始的输出



【同时测试多个信号】

[[email protected] ~]# trap "" HUP INT QUIT TSTP TERM

[[email protected] ~]# trap ":" HUP INT QUIT TSTP TERM

[[email protected] ~]# trap "" 1 2 3 20 15

[[email protected] ~]# trap ":" 1 2 3 20 15



【shell跳板机案例】(触发信号后屏蔽信号)

 方法:

 1)首先做好ssh+key认证

 2)实现传统的远程连接菜单选择脚本

 3)利用Linux信号防止用户在跳板机上操作

 4)用户登陆后即调用脚本

 [[email protected] ~]# cat /etc/profile.d/tiaoban.sh 

 [ $UID -ne 0 ] && . /server/scripts/tiaoban.sh

 [[email protected] ~]#  cat /server/scripts/tiaoban.sh

 function trapper () {

 trap ‘:‘ INT EXIT TSTP TEMP HUP

 }


 while :

 do 

         trapper       #我在这里调用函数trapper,然则调用了上面五个信号,其有中Ctrl+c信号

         clear         #清屏

         cat <<menu    #终端打印出下面三排菜单供普通用户选择

             1)web a

             2)web b

             3)exit

 menu


         read -p "please select:" num    #让用户选择一个数字

         case "$num" in

         1)

         echo 1

         ssh 192.168.1.107

         ;;

         2)

         echo 2

         ssh 192.168.1.108

         ;;

         3|*)

         exit

         esac

 done


 普通用户测试登陆:

 技术分享

 输入普通用户名和密码

 技术分享

 在这里按Ctrl+c没效果,你必须选择敲一个数字连接,或者选择敲3退出

 技术分享

 


本文出自 “wsyht的博客” 博客,请务必保留此出处http://wsyht2015.blog.51cto.com/9014030/1790623

以上是关于trap信号捕捉详解的主要内容,如果未能解决你的问题,请参考以下文章

shell脚本进阶之信号的捕捉

信号捕捉trap及其在shell中的用法

Linux trap(捕捉) 命令

bash编程的信号捕获:

16.2信号捕捉

Linux:详解进程信号(信号的捕捉流程,信号的阻塞volatile关键字)