仓酷云

标题: 来一发shell中trap捕捉旌旗灯号 [打印本页]

作者: 莫相离    时间: 2015-1-14 20:14
标题: 来一发shell中trap捕捉旌旗灯号
欢迎大家来到仓酷云论坛!旌旗灯号是一种历程间通讯机制,它给使用步伐供应一种异步的软件中止,使使用步伐无机会承受其他步伐活终端发送的下令(即旌旗灯号)。使用步伐收到旌旗灯号后,有三种处置体例:疏忽默许,或捕获。历程收到一个旌旗灯号后,会反省对该旌旗灯号的处置机制。假如是SIG_IGN,就疏忽该旌旗灯号;假如是SIG_DFT,则会接纳体系默许的处置举措,一般是停止历程或疏忽该旌旗灯号;假如给该旌旗灯号指定了一个处置函数(捕获),则会中止以后历程正在实行的义务,转而往实行该旌旗灯号的处置函数,前往后再持续实行被中止的义务。
在有些情形下,我们不但愿本人的shell剧本在运转时候被中止,好比说我们写得shell剧本设为某一用户的默许shell,使这一用户进进体系后只能作某一项事情,如数据库备份,我们可不但愿用户利用Ctrlc之类便进进到shell形态,做我们不但愿做的事变。这便用到了旌旗灯号处置。
以下是一些你大概会碰到的,要在步伐中利用的更罕见的旌旗灯号:
旌旗灯号称号旌旗灯号数形貌SIGHUP1本旌旗灯号在用户终端毗连(一般或非一般)停止时收回,一般是在终真个把持历程停止时,关照统一session内的各个功课,这时候它们与把持终端不再联系关系。登录Linux时,体系会分派给登任命户一个终端(Session)。在这个终端运转的一切步伐,包含前台历程组和背景历程组,一样平常都属于这个Session。当用户加入Linux登录时,前台历程组和背景有对终端输入的历程将会收到SIGHUP旌旗灯号。这个旌旗灯号的默许操纵为停止历程,因而前台历程组和背景有终端输入的历程就会中断。关于与终端离开干系的保卫历程,这个旌旗灯号用于关照它从头读取设置文件。SIGINT2步伐停止(interrupt)旌旗灯号,在用户键进INTR字符(一般是CtrlC)时收回。SIGQUIT3和SIGINT相似,但由QUIT字符(一般是Ctrl/)来把持.历程在因收到SIGQUIT加入时会发生core文件,在这个意义上相似于一个步伐毛病旌旗灯号。SIGFPE8在产生致命的算术运算毛病时收回.不但包含浮点运算毛病,还包含溢出及除数为0等别的一切的算术的毛病。SIGKILL9用来当即停止步伐的运转.本旌旗灯号不克不及被堵塞,处置和疏忽。SIGALRM14时钟准时旌旗灯号,盘算的是实践的工夫或时钟工夫.alarm函数利用该旌旗灯号。SIGTERM15步伐停止(terminate)旌旗灯号,与SIGKILL分歧的是该旌旗灯号能够被堵塞和处置.一般用来请求步伐本人一般加入.shell下令kill缺省发生这个旌旗灯号。捕捉旌旗灯号
当你按下Ctrl+C键或Break键在终端一个shell步伐的实行过程当中,一般步伐将当即停止,并前往下令提醒符。这大概其实不老是可取的。比方,你大概终极留下了一堆一时文件,将不会清算。

捕捉这些旌旗灯号是很简单的,trap下令的语法以下:
  1. $trapcommandssignals
复制代码
这里的下令能够是任何无效的Linux下令,或一个用户界说的函数,旌旗灯号能够是恣意数目的旌旗灯号,你想来捕捉的列表。
在shell剧本中的圈套有三种罕见的用处:
清算一时文件:
trap下令作为一个例子,上面展现了怎样能够删除一些文件,然前进出,假如有人试图从终端中断步伐:
  1. trap"rm-f$WORKDIR/work1$$$WORKDIR/dataout$$;exit"2
复制代码
实行shell步伐,这个圈套的角度,这两个文件work1$$和dataout$$将被主动删除,假如步伐吸收旌旗灯号数为2。
因而,用户中止实行,假如实行的步伐后,这个圈套你能够宁神,这两个文件将被清算。exit下令以下rm是需要的,由于没有它的实行将持续在节目中的一点,它分开时收到旌旗灯号。
1号旌旗灯号发生挂断:要末有人存心挂断线路或线路被不测断开。
您能够修正后面的圈套也删除指定的文件,在这类情形下,两个旌旗灯号旌旗灯号1号增加到列表:
  1. $trap"rm$WORKDIR/work1$$$WORKDIR/dataout$$;exit"12
复制代码
如今,这些文件将被删除,假如该行被挂了,大概按Ctrlc键被按下。
来捕捉指定的下令必需用引号括起来,假如它们包括一个以上的下令。别的请注重,在shell下令行扫描trap下令失掉实行,并再次当一个所列出的的旌旗灯号被吸收的工夫。
WORKDIR值$$以是在后面的例子中,将被代替trap下令实行的工夫。假如你想这类替换产生在收到旌旗灯号1或2的工夫你能够把单引号内的下令:
  1. $traprm$WORKDIR/work1$$$WORKDIR/dataout$$;exit12
复制代码
疏忽旌旗灯号:
假如圈套列出的下令是空的,指定的旌旗灯号吸收时,将被疏忽。比方,上面的下令:
  1. $trap2
复制代码
指定的中止旌旗灯号是被疏忽的。你大概要疏忽某些旌旗灯号时举行一些操纵,不但愿打断。能够指定多个旌旗灯号被疏忽以下:
  1. $trap12315
复制代码
注重,第一个参数必需被指定为一个旌旗灯号被疏忽,而不是相称于写进上面的内容,它具有自力的寄义也各有:
  1. $trap2
复制代码
假如你疏忽了一个旌旗灯号,一切的子shell也疏忽该旌旗灯号。不外,假如指定要接纳的举动在收到的旌旗灯号,一切的子shell仍旧会在收到该旌旗灯号的默许操纵。
重设圈套:
当你改动了默许在收到旌旗灯号后应接纳的举措,你能够改动它返来的圈套,假如你只是省略第一个参数;
  1. $trap12
复制代码
复位应接纳的举措收到旌旗灯号1或2前往默许。
如果您觉得本篇CentOSLinux教程讲得好,请记得点击右边漂浮的分享程序,把好文章分享给你的小伙伴们!
作者: 再见西城    时间: 2015-1-15 07:22
标题: 来一发shell中trap捕捉旌旗灯号
好帖必须得顶起
作者: 飘飘悠悠    时间: 2015-1-21 21:18
现在的linux操作系统如redhat,难点,红旗等,都是用这么一个内核,加上其它的用程序(包括X)构成的。
作者: 仓酷云    时间: 2015-1-30 22:58
通过一条缓慢的调制解调器线路,它也能操纵几千公里以外的远程系统。
作者: 变相怪杰    时间: 2015-2-6 17:10
得到到草率的回答或者根本得不到任何Linux答案。越表现出在寻求帮助前为解决问题付出的努力,你越能得到实质性的帮助。
作者: 兰色精灵    时间: 2015-2-17 20:50
选择一些适于初学者的Linux社区。
作者: 活着的死人    时间: 2015-3-6 00:04
尽我能力帮助他人,在帮助他人的同时你会深刻巩固知识。
作者: 冷月葬花魂    时间: 2015-3-12 18:10
我学习Linux的心得体会 ,希望对大家的学习有所帮助,由于水平有限,本文难免有所欠缺,望请指正。
作者: 灵魂腐蚀    时间: 2015-3-20 02:11
选择一些适于初学者的Linux社区。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2