shell中trap捕获信号
信号是一种进程间通信机制,它给应用程序提供一种异步的软件中断,使应用程序有机会接受其他程序活终端发送的命令(即信号)。应用程序收到信号后,有三种处理方式:忽略,默认,或捕捉。进程收到一个信号后,会检查对该信号的处理机制。如果是SIG_IGN,就忽略该信号;如果是SIG_DFT,则会采用系统默认的处理动作,通常是终止进程或忽略该信号;如果给该信号指定了一个处理函数(捕捉),则会中断当前进程正在执行的任务,转而去执行该信号的处理函数,返回后再继续执行被中断的任务。 在有些情况下,我们不希望自己的shell脚本在运行时刻被中断,比如说我们写得shell脚本设为某一用户的默认shell,使这一用户进入系统后只能作某一项工作,如数据库备份, 我们可不希望用户使用Ctrl c之类便进入到shell状态,做我们不希望做的事情。这便用到了信号处理。 以下是一些你可能会遇到的,要在程序中使用的更常见的信号:
信号名称 信号数 描述
SIGHUP 本信号在用户终端连接(正常或非正常)结束时发出, 通常是在终端的控制进程结束时, 通知同一session内的各个作业, 这时它们与控制终端不再关联。
登录Linux时,系统会分配给登录用户一
个终端(Session)。在这个终端运行的所有程序,包括前台进程组和后台进程组,
一般都属于这个Session。当用户退出Linux登录时,前台进程组和后台有对终端输出的进程将会收到SIGHUP信号。
这个信号的默认操作为终止进程,因此前台进程组和后台有终端输出的进程就会中止。对于与终端脱离关系的守护进程,这个信号用于通知它重新读取配置文件。
SIGINT 程序终止(interrupt)信号, 在用户键入INTR字符(通常是Ctrl C)时发出。
SIGQUIT 和SIGINT类似, 但由QUIT字符(通常是Ctrl /)来控制. 进程在因收到SIGQUIT退出时会产生core文件, 在这个意义上类似于一个程序错误信号。
SIGFPE 在发生致命的算术运算错误时发出. 不仅包括浮点运算错误, 还包括溢出及除数为0等其它所有的算术的错误。
SIGKILL 用来立即结束程序的运行. 本信号不能被阻塞, 处理和忽略。
SIGALRM 时钟定时信号, 计算的是实际的时间或时钟时间. alarm函数使用该信号。
SIGTERM 程序结束(terminate)信号, 与SIGKILL不同的是该信号可以被阻塞和处理. 通常用来要求程序自己正常退出. shell命令kill缺省产生这个信号。 捕获信号
当你按下Ctrl + C键或Break键在终端一个shell程序的执行过程中,正常程序将立即终止,并返回命令提示符。这可能并不总是可取的。例如,你可能最终留下了一堆临时文件,将不会清理。 捕获这些信号是很容易的,trap命令的语法如下:
$ trap commands signals
这里的命令可以是任何有效的Linux命令,或一个用户定义的函数,信号可以是任意数量的信号,你想来捕获的列表。 在shell脚本中的陷阱有三种常见的用途:
清理临时文件
忽略信号
清理临时文件:
trap命令作为一个例子,下面展示了如何可以删除一些文件,然后退出,如果有人试图从终端中止程序:
trap "rm -f $WORKDIR/work1$$ $WORKDIR/dataout$$; exit"
执行shell程序,这个陷阱的角度,这两个文件work1$$ 和 dataout$$将被自动删除,如果程序接收信号数为2。 因此,用户中断执行,如果执行的程序后,这个陷阱你可以放心,这两个文件将被清理。 exit 命令如下 rm 是必要的,因为没有它的执行将继续在节目中的一点,它离开时收到信号。 1号信号产生挂断:要么有人故意挂断线路或线路被意外断开。 您可以修改前面的陷阱也删除指定的文件,在这种情况下,两个信号信号1号添加到列表:
$ trap "rm $WORKDIR/work1$$ $WORKDIR/dataout$$; exit"
现在,这些文件将被删除,如果该行被挂了,或者按Ctrl c键被按下。 来捕获指定的命令必须用引号括起来,如果它们包含一个以上的命令。另外请注意,在 shell 命令行扫描 trap 命令得到执行,并再次当一个所列出的的信号被接收的时间。 WORKDIR 值 $$ 所以在前面的例子中,将被取代 trap 命令执行的时间。如果你想这种替代发生在收到信号1或2的时间你可以把单引号内的命令:
$ trap 'rm $WORKDIR/work1$$ $WORKDIR/dataout$$; exit'
忽略信号:
如果陷阱列出的命令是空的,指定的信号接收时,将被忽略。例如,下面的命令:
$ trap ''
指定的中断信号是被忽略的。你可能要忽略某些信号时进行一些操作,不希望打断。可以指定多个信号被忽略如下:
$ trap ''
注意,第一个参数必须被指定为一个信号被忽略,而不是相当于写入下面的内容,它具有独立的含义也各有:
$ trap
如果你忽略了一个信号,所有的子shell也忽略该信号。不过,如果指定要采取的行动在收到的信号,所有的子shell仍然会在收到该信号的默认操作。
重设陷阱:
当你改变了默认在收到信号后应采取的动作,你可以改变它回来的陷阱,如果你只是省略第一个参数;
$ trap
复位应采取的动作收到信号1或2 返回默认。 Linux笔记(linuxnotes)
shell中trap捕获信号的更多相关文章
- 为shell布置陷阱:trap捕捉信号方法论
本文目录: 1.1 信号说明 1.2 trap布置陷阱 1.3 布置完美陷阱必备知识 家里有老鼠,快消灭它!哎,又给跑了.老鼠这小东西跑那么快,想直接直接消灭它还真不那么容易.于是,老鼠药.老鼠夹子或 ...
- trap在shell中捕捉信号
一.trap捕捉到信号之后,可以有三种反应方式:(1)执行一段程序来处理这一信号(2)接受信号的默认操作(3)忽视这一信号 二.trap对上面三种方式提供了三种基本形式:第一种形式的trap命令在sh ...
- linux中脚本扑捉(trap)信号问题
扑捉ctrl+c信号: #!/bin/bash trap ; function trap() { echo "You press Ctrl+C."; echo "Exit ...
- shell——trap捕捉信号(附信号表)
trap捕捉信号有三种形式 第一种:trap "commands" signal-list 当脚本收到signal-list清单内列出的信号时,trap命令执行双引号中的命令. 例 ...
- 在 docker 容器中捕获信号
我们可能都使用过 docker stop 命令来停止正在运行的容器,有时可能会使用 docker kill 命令强行关闭容器或者把某个信号传递给容器中的进程.这些操作的本质都是通过从主机向容器发送信号 ...
- 26 bash shell中的信号
当没有任何捕获时,一个交互式 Bash Shell 会忽略 SIGTERM(发送到进程的 TERM 信号用于要求进程终止) 和 SIGQUIT(当用户要求进程执行 core dump 时,QUIT 信 ...
- Linux信号与golang中的捕获处理
什么是信号 在计算机科学中,信号是Unix.类Unix以及其他POSIX兼容的操作系统中进程间通讯的一种有限制的方式.它是一种异步的通知机制,用来提醒进程一个事件已经发生. 当一个信号发送给一个进程, ...
- shell中信号处理
参考: Shell 脚本中信号处理实践 Linux Shell 的信号 trap 功能你必须知道的细节 在 unix 里,可能发生的每一种类型的事件都是由一个独立的信号来描述,每一个信号都是一个小 ...
- Shell中, 退出整个脚本
常规做法 cat >test.sh<<EOF'' #!/bin/bash exit_script(){ exit 1 } echo "before exit" e ...
随机推荐
- 修改虚拟机linux硬盘的大小
一.概述 Ubuntu用了一段时间,系统已从原来的4G增长到8G,导致虚拟磁盘不够用,需要修改虚拟硬盘的大小. 但是,修改虚拟机硬盘的大小不像修改内存那么简单,操作一个滑动条就轻松搞定.要知道虚拟硬盘 ...
- POJ 3041 Asteroids 最小点覆盖 == 二分图的最大匹配
Description Bessie wants to navigate her spaceship through a dangerous asteroid field in the shape o ...
- js 时间函数 及相关运算大全
js 时间函数 及相关运算大全 var myDate = new Date(); myDate.getYear(); //获取当前年份(2位) myDate.getFullYear(); ...
- Python处理XML
在Python(以及其他编程语言)内有两种常见的方法处理XML:SAX(Simple API for XML)和DOM(Document Object Model,文档对象模型).SAX语法分析器读取 ...
- 10055 - Hashmat the Brave Warrior
Problem A Hashmat the brave warrior Input: standard input Output: standard output Hashmat is a brave ...
- Unity与IOS交互
Unity IOS交互 @By 广州小龙 QQ群:63438968 环境:Mac os 10.9.2 Unity 4.2.1f4 Xcode 5.0.2 Unity IOS的交互我写过一个教程 ...
- JAVA基础知识点(转载的)
转载请注明出处:http://blog.csdn.net/ns_code/article/details/8846697 1.使用浮点型数值时,默认的类型是double,后面加上f或F才被识别为flo ...
- Scala:(1)变量
Scala中变量需要注意的地方: (1)val,var val 定义的声明是一个常量,不能改变内容. var定义的声明是一个变量,可以改变其内容 在Scala中,尽可能使用val val answer ...
- 如何查看jar包的版本号?
jar包根目录里的META-INF目录下的MANIFEST.MF文件里一般有会记录版本信息,可以到这个文件里查看 打开Java的JAR文件我们经常可以看到文件中包含着一个META-INF目录,这个 ...
- 启动tomcat的 startup.bat屏幕一闪而过
有时启动tomcat 时,屏幕一闪而过,看不到是那里有问题.要想让屏幕停下来,做法如下: 1.打开 startup.bat 文件,在文件最后加上最后加一行@pause 2.重新运行 startup.b ...