Linux trap用法介绍

trap命令是一个shell内建命令,它用来在脚本中指定信号如何处理。trap命令的参数分为两部分,前一部分是接收到指定信号时将要采取的行动,后一部分是要处理的信号名.

格式:trap commands signals

1. 执行一段程序来处理这一信号


1

MyUbuntu:/home/linxiaojia>trap "echo `date`" SIGINT

表示当前shell进程接收到CTRL+C信号时,打印出当前时间。按CTRL+C试一试:


1

MyUbuntu:/home/linxiaojia>^C2014年 11月 20日 星期四 23:02:18 CST

这里要说明一下commands部分双引号与单引号的区别,刚刚的例子用了双引号(“echo `date`”),那么trap注册信号处理时,会把变量替换后再注册,所以刚刚的例子,无论你什么时候发送SIGINT信号,输出总是一样;若用了单引号,则表示当信号发生的时候才替换命令中的变量,所以以下例子在不同的时间按CTRL+C,将会输出不同的时间。


1

2

3

MyUbuntu:/home/linxiaojia>trap ‘echo `date`‘ SIGINT

MyUbuntu:/home/linxiaojia>^C2014年 11月 20日 星期四 23:22:49 CST

MyUbuntu:/home/linxiaojia>^C2014年 11月 20日 星期四 23:22:51 CST

我们可以用trap命令来查看已经注册的信号处理。


1

2

MyUbuntu:/home/linxiaojia>trap

trap -- ‘echo `date`‘ SIGINT

若是用双引号方式注册的,用trap命令查看,结果如下:


1

2

MyUbuntu:/home/linxiaojia>trap

trap -- ‘echo 2014年 11月 20日 星期四 23:02:18 CST‘ SIGINT

2. 取消trap对信号处理,即接受信号的默认操作

如取消上述对SIGINT信号处理,可用:


1

MyUbuntu:/home/linxiaojia>trap SIGINT

取消后,按CTRL+C采用系统默认处理方式,即中断进程。

3. 忽视信号

即接收了信号,但什么都不做。


1

MyUbuntu:/home/linxiaojia>trap ‘‘ SIGINT

此时任你怎么按CTRL+C,什么都没发生。

4. 查看所有信号

可用trap -l 查看信号名及信号值


1

2

3

4

5

6

7

8

9

10

11

12

13

14

MyUbuntu:/home/linxiaojia>trap -l

 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP

 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL10) SIGUSR1

11) SIGSEGV12) SIGUSR213) SIGPIPE14) SIGALRM15) SIGTERM

16) SIGSTKFLT17) SIGCHLD18) SIGCONT19) SIGSTOP20) SIGTSTP

21) SIGTTIN22) SIGTTOU23) SIGURG24) SIGXCPU25) SIGXFSZ

26) SIGVTALRM27) SIGPROF28) SIGWINCH29) SIGIO30) SIGPWR

31) SIGSYS34) SIGRTMIN35) SIGRTMIN+136) SIGRTMIN+237) SIGRTMIN+3

38) SIGRTMIN+439) SIGRTMIN+540) SIGRTMIN+641) SIGRTMIN+742) SIGRTMIN+8

43) SIGRTMIN+944) SIGRTMIN+1045) SIGRTMIN+1146) SIGRTMIN+1247) SIGRTMIN+13

48) SIGRTMIN+1449) SIGRTMIN+1550) SIGRTMAX-1451) SIGRTMAX-1352) SIGRTMAX-12

53) SIGRTMAX-1154) SIGRTMAX-1055) SIGRTMAX-956) SIGRTMAX-857) SIGRTMAX-7

58) SIGRTMAX-659) SIGRTMAX-560) SIGRTMAX-461) SIGRTMAX-362) SIGRTMAX-2

63) SIGRTMAX-164) SIGRTMAX

数字表示数据的十进制值,在命令中即可以用信号名也可以用信号十进制值,如trap "echo haha"  SIGINT 与 trap "echo haha" 2 相同。

5. 使用kill命令发送信号

除了系统在某些事件发生时自动发送的信号外,用户还可手动发送特定的信号。利用kill -s signal pid,表示向进程号为pid的进程发送signal信号,如果要向当前shell进程发送信号,可以用kill -s signal $$ 。有如下几种发送信号方式:


1

2

3

4

5

6

7

MyUbuntu:/home/linxiaojia>trap "echo haha" SIGABRT

MyUbuntu:/home/linxiaojia>kill -s SIGABRT $$

haha

MyUbuntu:/home/linxiaojia>kill -ABRT $$

haha

MyUbuntu:/home/linxiaojia>kill -6 $$

haha

6.使用kill函数发送信号

查看当前登录进程的shell进程号是多少:


1

2

MyUbuntu:/home/linxiaojia>ps -ef|grep bash|grep "pts/0"|grep -v grep

linxiao+  2994  2986  0 22:45 pts/0    00:00:00 -bash

写一个简单测试程序:


1

2

3

4

5

6

7

#include<stdio.h>

#include<signal.h>

int main()

{

kill(2994,SIGABRT);

return 0;

}


1

2

MyUbuntu:/home/linxiaojia/priv/lxj/mytest>a.out

haha

可以看到结果一样,在对应的终端上输出haha, 若是在别的终端发送信号,登记trap的终端接收到信号后,要按回车才会输出haha。

7.总结

本文介绍linux下trap的用法以及用kill命令及kill函数发送信号的方法。可以加深读者对shell信号处理的理解。

时间: 2024-10-10 08:39:45

Linux trap用法介绍的相关文章

linux 系统下iostat、iotop、vmstat安装以及用法介绍

一.iostat安装与用法介绍 主要用于监控系统设备的IO负载情况,iostat首次运行时显示自系统启动开始的各项统计信息,之后运行iostat将显示自上次运行该命令以后的统计信息. 用户可以通过指定统计的次数和时间来获得所需的统计信息. 1.安装(RedHat系列) 查看系统是否安装这个命令 #which iostat       ##显示如下,表示系统已经安装了 /usr/bin/iostat 如果没有安装,则安装 #yum install sysstat -y 2.语法 iostat [ 

linux find用法总结

前言:我们为什么要学会使用find命令? 转自:http://blog.chinaunix.net/uid-24648486-id-2998767.html 每一种操作系统都有成千上万的文件组成,对于linux这样"一切皆文件"的操作系统来说更不例外,大家应该都能很轻松使用windows下的文件查找功能,但是对linux这一功能可能并不是很熟悉,其实想玩linux的你更要牢牢掌握这个命令,因为linux不像windows那样有固定的文件名后缀,并且因为linux阵营下百家争鸣的特性,一

php $_SERVER[&#39;HTTP_USER_AGENT&#39;] 用法介绍

在PHP中HTTP_USER_AGENT是用来获取用户的相关信息的,包括用户使用的浏览器,操作系统等信息, 显示结果为: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.2372.400 QQBrowser/9.5.10548.400 这个时候我们可以用正则表达式来匹配以上字符串,用户的浏览器,操作系统信息

linux的基本介绍和命令行

<linux的基本介绍和命令行> [什么是Shell] (1)简介:shell是一款保护内核的软件.bash是shell的一个版本. 性质:命令解析器 用途:接受用户命令 1)在计算机科学中,shell俗称壳(用来区别核),是指"提供使用者使用界面"的软件(命令解析器).他类似于DOS和后来的cmd.exe.他接收用户命令,然后调用相应的应用程序.同时他又是一种程序设计语言.作为命令语言,他交互式解释和执行用户输入的命令,或者自动地解释和执行预先设定好的一连串命令:作为程序

linux curl用法详解

linux ‍‍curl用法详解 ‍‍curl的应用方式,一是可以直接通过命令行工具,另一种是利用libcurl库做上层的开发.本篇主要总结一下命令行工具的http相关的应用, 尤其是http下载方面的:下一篇再讲基于libcurl库的开发. curl的命令行工具功能非常强大,这些数据交互的功能基本上都是通过URL方式进行的,我们先来看看curl对多个URL的灵活操作,这些规则使我们的 批处理需求应用起来非常方便. 1.用{}表示多个URL    如 http://site.{one,two,t

Linux socket用法

转自:http://www.cnblogs.com/skynet/archive/2010/12/12/1903949.html  有删改 1.网络中进程之间如何通信? 本地的进程间通信(IPC)有很多种方式,但可以总结为下面4类: 消息传递(管道.FIFO.消息队列) 同步(互斥量.条件变量.读写锁.文件和写记录锁.信号量) 共享内存(匿名的和具名的) 远程过程调用(Solaris门和Sun RPC) 但这些都不是本文的主题!我们要讨论的是网络中进程之间如何通信?首要解决的问题是如何唯一标识一

关于Java中this和super的用法介绍和区别

1.this&super 什么是this,this是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针.当你想要引用当前对象的某种东西,比如当前对象的某个方法,或当前对象的某个成员,你便可以利用this来实现这个目的.要注意的是this只能在类中的非静态方法中使用,静态方法和静态的代码块中绝对不能出现this.his也可作为构造函数来使用.在后面可以看到 而什么是super,可以理解为是指向自己超(父)类对象的一个指针,而这个超类指的是离自己最近的一个父类.super的作用同样是可

(转)常用算法(Algorithm)的用法介绍

2算法部分主要由头文件<algorithm>,<numeric>和<functional>组成. 2<algorithm>是所有STL头文件中最大的一个,其中常用到的功能范围涉及到比较.交换.查找.遍历操作.复制.修改.反转.排序.合并等等. 2<numeric>体积很小,只包括几个在序列上面进行简单数学运算的模板函数,包括加法和乘法在序列上的一些操作. 2<functional>中则定义了一些模板类,用以声明函数对象. 2STL提供

grep过滤用法介绍(一)

grep过滤用法介绍(一) grep主要作用是过滤出指定的行,指定的行满足什么条件,满足的条件我们就可以用一个正则表达式来表示.为了方便下面的实验进行,我们先进行cp /etc/passwd  1.txt 例如:#grep 'root'1.txt,截图如下: 匹配过滤出,有root的行! grep有一个选项很好用: 1.grep --color 'root' 1.txt 标注红色.为了方便使用,我们做一个别名操作,alias cgrep='grep --color'[删除用unalias+别名]