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退出

时间: 2024-08-13 05:25:35

trap信号捕捉详解的相关文章

LINUX 信号概念详解

LINUX 信号概念详解 我们运行如下命令,可看到Linux支持的信号列表: # 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 17) SIGCHLD 18) SIGCONT 19) SIGSTOP

HttpWatch的时间段捕捉详解

这是一个IE的插件,下载可以点这里.下载后解压如下图所示,一共有4个文件.HttpWatch Professional是单独软件,可以单独使用: 插件安装时,只需运行httpwatchpro.exe,通常的安装过程.然后打开浏览器,就可以看到已经安装好的插件了: 下面以百度为例来看TimeChart,详解捕捉到的网页的详细各个响应时间 blocked:浏览器预处理时间(例如读取本地缓存的时间).等待网络连接成功的时间.IE对一个主机名最多(例如www.baidu.com)可以同时创建2个网络连接

高速数字逻辑电平(8)之LVDS差分信号深度详解

原文地址点击这里: LVDS(Low-Voltage Differential Signaling ,低电压差分信号)是美国国家半导体(National Semiconductor, NS,现TI)于1994年提出的一种信号传输模式的电平标准,它采用极低的电压摆幅高速差动传输数据,可以实现点对点或一点对多点的连接,具有低功耗.低误码率.低串扰和低辐射等优点,已经被广泛应用于串行高速数据通讯场合当中. LVDS技术规范有两个标准,即TIA(电讯工业联盟)/EIA(电子工业联盟)的ANSI/TIA/

shell脚本临时文件生成和使用,信号捕捉

实例:生成临时文件记录apache进程号,杀死apache进程,删除临时文件 1 #!/bin/bash 2 #create_log.sh 3 4 #1.获取到所有httpd应用程序的进程号 5 #2.把进程号存入一个临时文件中 6 #3.从临时文件中取出所有的apache的进程号 7 #4.使用for循环用kill杀掉所有的httpd进程 8 #5.删除之前生成的临时文件 9 #6.输出关闭进程后的消息 10 #$$当前程序运行时候开辟的pid 11 12 tmpfile=$$.txt 13

linux系统下信号详解2

信号是UNIX 系统所使用的进程通信方法中,最古老的一种.信号不但能从内核发往一个进程,也能从一个进程发往另一个进程.例如,用户在后台启动了一个要运行较长时间的程序,如果想中断其执行,可以用kill 命令把SIGTERM信号发送给这个进程,SIGTERM 将终止此进程的执行.信号还提供了向UNIX 系统进程传送软中断的简单方法.信号可以中断一个进程,而不管它正在作什么工作.由于信号的特点,所以不用它来作进程间的直接数据传送,而把它用作对非正常情况的处理.由于信号本身不能直接携带信息,这就限制了它

详解linux进程间通信-信号

前言:之前说看<C++ Primer >暂时搁浅一下,迷上公司大神写的代码,想要明白,主要是socket.进程间通信! 知道进程间通信:信号.信号量.管道.消息队列.共享内存(共享存储),也能写些简单代码进行通信,但不知道应用在哪?感觉很多小伙伴跟我有类似经历吧? 一.应用实例: 要去linux设备上去添加.改密用户:本地去linux设备添加用户,用socket实现,其实大神改的ssh源码来实现的,这不是我要讲的重点,而我要讲的是准备过程,去登陆linux设备,要准备好:管理员.密码等. 简略

Linux信号详解

Linux信号详解 一 信号的种类 可靠信号与不可靠信号, 实时信号与非实时信号 可靠信号就是实时信号, 那些从UNIX系统继承过来的信号都是非可靠信号, 表现在信号 不支持排队,信号可能会丢失, 比如发送多次相同的信号, 进程只能收到一次. 信号值小于 SIGRTMIN的都是非可靠信号. 非可靠信号就是非实时信号, 后来, Linux改进了信号机制, 增加了32种新的信号, 这些信 号都是可靠信号, 表现在信号支持排队, 不会丢失, 发多少次, 就可以收到多少次. 信号值 位于 [SIGRTM

第三百五十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy信号详解

第三百五十五节,Python分布式爬虫打造搜索引擎Scrapy精讲-scrapy信号详解 信号一般使用信号分发器dispatcher.connect(),来设置信号,和信号触发函数,当捕获到信号时执行一个函数 dispatcher.connect()信号分发器,第一个参数信号触发函数,第二个参数是触发信号, signals.engine_started当Scrapy引擎启动爬取时发送该信号.该信号支持返回deferreds.signals.engine_stopped当Scrapy引擎停止时发送

PyQt5信号与槽详解

1.信号与槽函数基础'''信号与槽函数基础,信号是一个事件,发射信号之后槽函数就会执行'''from PyQt5.QtWidgets import *import sys class signal(QWidget): def __init__(self): super(signal,self).__init__() self.initUI() #编辑控件及其关联的信号 def initUI(self): self.resize(300,200) self.setWindowTitle("信号与槽