`

linux下的trap命令

阅读更多
trap命令用于指定在接收到信号后将要采取的动作。常见的用途是在脚本程序被中断时完成清理工作。不过,这次我遇到它,是因为客户有个需求:从终端访问服务器的用户,其登陆服务器后会自动运行某个命令,例如打开应用(命令写在.bashrc等文件中),最后退出,并断开连接;期间是不能允许其使用Ctrl+C等中断退出应用,而回到Shell环境,否则可能会带来安全问题。
    当然,解决的方式有很多,如在应用中屏蔽中断信号、使用chroot方式访问等。但这些方法都有一些限制,如需要修改应用,让telnet等支持chroot方式(ssh可支持chroot)等。而使用trap也是一种比较好的解决方法。

一、关于信号
历史上,shell总是用数字来代表信号,而新的脚本程序应该使用信号的名字,它们保存在用#include命令包含进来的signal.h头文件中,在使用信号名时需要省略SIG前缀。
kill和trap等都可以看到信号编号及其关联的名称。“信号”是指那些被异步发送到一个程序的事件。默认情况下,它们通常会终止一个程序的运行。

引用
# trap -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     20) SIGTSTP     21) SIGTTIN
22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO
30) SIGPWR      31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1
36) SIGRTMIN+2  37) SIGRTMIN+3  38) SIGRTMIN+4  39) SIGRTMIN+5
40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8  43) SIGRTMIN+9
44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13
52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9
56) SIGRTMAX-8  57) SIGRTMAX-7  58) SIGRTMAX-6  59) SIGRTMAX-5
60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2  63) SIGRTMAX-1
64) SIGRTMAX

附录中有个说明文档。

二、trap 的使用
1、运行格式
trap命令的参数分为两部分,前一部分是接收到指定信号时将要采取的行动,后一部分是要处理的信号名。


trap command signal

它有三种形式分别对应三种不同的信号回应方式。
第一种:


trap "commands" signal-list

当脚本收到signal-list清单内列出的信号时,trap命令执行双引号中的命令。
第二种:


trap signal-list

trap不指定任何命令,接受信号的默认操作,默认操作是结束进程的运行。
第三种:


trap " " signal-list

trap命令指定一个空命令串,允许忽视信号,我们用到的就是这一种。
※ 请记住,脚本程序通常是以从上到下的顺序解释执行的,所以必须在你想保护的那部分代码以前指定trap命令。

2、测试
按照用户的要求,我们需要屏蔽的是HUP INT QUIT TSTP几个信号。所以,可以运行:


# trap "" HUP INT QUIT TSTP

这个时候,可以试试打开一个持续的命令,然后中断其运行,例如:


# tail -f /var/log/messages

接着,试试用Ctrl+C 或 Ctrl+\ 来中断试试,会程序是不会退出的。

3、恢复信号
如果想恢复的话,可以用Ctrl+Z把程序放到后台,然后运行:


# trap : HUP INT QUIT TSTP

然后,用ps -ef看看其PID号,bg 1让程序继续运行,最后用kill 杀掉即可。

4、其他
您也可以试试运行:


# trap "echo 'Hello World' " HUP INT QUIT TSTP

这样,当您运行Ctrl+C 等中断时,会自动运行echo命令,结果就是现实Hello World字符串:

引用
# tail -f /var/log/messages
May 18 16:57:54 192.168.228.153 dhcpd: DHCPREQUEST for 192.168.228.221 from 00:1d:72:92:d4:68 via eth0
May 18 16:57:54 192.168.228.153 dhcpd: DHCPACK on 192.168.228.221 to 00:1d:72:92:d4:68 via eth0

[root@mail ~]# Hello World

※ 注意,这方式并不能屏蔽中断,敲入Ctrl+C 等信息后,仍以默认行为动作的,也就是退出程序,仅会再运行一个额外的命令而已。

三、附录
1、中断按键
不同的终端类型、Shell版本其中断的按键是不同的,甚至还可以自定义,这可通过stty命令查询:

引用
# stty -a
speed 38400 baud; rows 30; columns 111; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = ; eol2 = ; start = ^Q; stop = ^S;
susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke

^就是Ctrl的缩写。

2、信号详情

引用
名称      默认动作            说明
SIGHUP      终止进程      终端线路挂断
SIGINT    终止进程      中断进程
SIGQUIT   建立CORE文件  终止进程,并且生成core文件
SIGILL    建立CORE文件        非法指令
SIGTRAP   建立CORE文件        跟踪自陷
SIGBUS    建立CORE文件        总线错误
SIGSEGV   建立CORE文件        段非法错误
SIGFPE    建立CORE文件        浮点异常
SIGIOT    建立CORE文件        执行I/O自陷
SIGKILL   终止进程      杀死进程
SIGPIPE   终止进程      向一个没有读进程的管道写数据
SIGALARM  终止进程      计时器到时
SIGTERM   终止进程      软件终止信号
SIGSTOP   停止进程      非终端来的停止信号
SIGTSTP   停止进程      终端来的停止信号
SIGCONT   忽略信号      继续执行一个停止的进程
SIGURG    忽略信号      I/O紧急信号
SIGIO     忽略信号      描述符上可以进行I/O
SIGCHLD   忽略信号      当子进程停止或退出时通知父进程
SIGTTOU   停止进程      后台进程写终端
SIGTTIN   停止进程      后台进程读终端
SIGXGPU   终止进程      CPU时限超时
SIGXFSZ   终止进程      文件长度过长
SIGWINCH  忽略信号      窗口大小发生变化
SIGPROF   终止进程      统计分布图用计时器到时
SIGUSR1   终止进程      用户定义信号1
SIGUSR2   终止进程      用户定义信号2
SIGVTALRM 终止进程      虚拟计时器到时

请记住,脚本程序通常是以从上到下的顺序解释执行的,所以必须在你想保护的那部分代码以前指定trap命令。

如果要重置某个信号的处理条件到其默认值,只需简单的将command设置为-。如果要忽略某个信号,就把command设置为空字符串‘’。一个不带参数的trap命令将列出当前设置的信号及其行动的清单。

表2-11列出了X/Open规范里面规定的能够被捕获的比较重要的一些信号(括号里面的数字是传统的信号编号)。更多细节请参考signal在线手册的第七部分(man 7 signal)。

表 2-11

信     号
说     明

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

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

QUIT(3)
退出,通常因按下Ctrl+\组合键而引发

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

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

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


分享到:
评论

相关推荐

    Linux系统下trap命令在Shell编程中的应用.pdf

    "Linux系统下trap命令在Shell编程中的应用" Trap命令是Linux系统中Shell编程的一种重要命令,用于捕获信号并执行预定义的命令。该命令可以帮助程序员捕获各种信号,如错误的系统调用、用户产生的中断、非法指令等,...

    linux下的特殊命令

    以下是关于"linux下的特殊命令"的详细知识点: 1. **Shell脚本调试方法**: - `set -x`:开启命令追踪,打印出执行的每一条命令。 - `set -v`:开启命令行提示符的打印,显示每一行脚本被解析的情况。 - `set -n...

    Snmp_trap的配置与使用.doc

    在上述示例中,管理站在接收到Trap后尝试执行`page_me`命令,但因为该命令不存在而失败。这表明一个有效的Trap处理程序应当在`snmptrapd.conf`中定义,以处理接收到的不同类型的Trap。 总结来说,配置和使用SNMP ...

    Linux下配置SNMP

    Linux 下配置 SNMP SNMP(Simple Network Management Protocol,简单网络管理协议)是一种常用的网络管理协议,用于管理和监控网络设备。Linux 系统中配置 SNMP 需要安装和配置 SNMP daemon(守护进程),并配置 ...

    trapCommand

    信号是 Unix/Linux 系统中进程间通信的一种方式,`trap` 命令允许我们自定义这些信号的处理行为。以下是一些常用的信号及其默认行为: - **SIGINT**:通常由 Ctrl+C 触发,默认行为为终止进程。 - **SIGTERM**:...

    linux运维.doc

    Linux运维云计算服务器管理指南 ...我们学习了 Linux 服务器类型、网络配置、Apache 服务器安装、RPM 包管理、Yum 软件管理、sed 高级用法、Trap 信号处理、文件管理、diff 和 patch 命令等方面的内容。

    Linux下snmp的rpm安装包及安装教程.rar

    本教程将详细介绍如何在Linux环境下通过RPM包安装SNMP。 首先,你需要了解SNMP的基本概念。SNMP由三个主要组件构成:管理站(Manager)、代理(Agent)和管理信息库(MIB)。管理站负责收集和处理来自代理的数据,...

    Linux snmp模拟器(v1、v2、v3)

    总结来说,Linux snmpd模拟器是一个强大的工具,能够帮助开发者和管理员在无需真实网络设备的情况下进行SNMP相关的工作。通过灵活的配置,我们可以模拟各种复杂的网络环境,有效提升测试效率和质量。在实际操作中,...

    linux 命令及shell编程

    本篇文章将深入探讨这两个主题,帮助你掌握Linux环境下的基本操作和高级技巧。 **一、Linux命令** 1. **文件和目录操作** - `ls`:列出目录内容。 - `cd`:改变当前工作目录。 - `mkdir`:创建新目录。 - `rm`...

    linux系统命令及shell脚本实践指南.rar

    《Linux系统命令及Shell脚本实践指南》是针对Linux操作系统用户和管理员的一份宝贵资源,旨在帮助读者深入理解和熟练运用Linux环境中的基本命令以及编写高效Shell脚本。这份指南覆盖了从基础到高级的广泛主题,是...

    Linux下如何限制Root用户进行远程登陆

    Linux 下限制 Root 用户进行远程登陆的方法 在 Linux 系统中,限制 Root 用户进行远程登陆是非常重要的一步,以确保计算机系统的安全。下面我们将介绍四种方法来限制 Root 用户进行远程登陆。 方法一:在 /etc/...

    C语言中文网shell脚本教程

    .html`和`3.19Linux Shell trap命令:捕获信号.html`、`3.20Linux Shell trap命令捕获信号实例演示.html`将介绍Linux中的信号机制,这是一种进程间通信方式,用于通知进程某些事件的发生。trap命令允许我们定义当...

    LINUX环境下用C++实现SNMP网管协议

    Manager端运行在Linux操作系统上,部署有耶健同学编写的SNMP应用软件,用于发送GET、GET-NEXT和SET等命令,以查询或修改网络设备的状态。Agent端则位于网络中的各个设备上,接收并响应Manager端的请求。 #### 2. ...

    Linux基础试题及答案.docx

    本资源摘要信息涵盖了 Linux 基础知识点,涵盖了 Linux 的基本概念、命令、文件系统、权限管理、shell 编程等方面。 一、Linux 基础概念 * Linux 是一个开源操作系统,基于 Unix 操作系统 * Linux 的主要特点是...

    Use-SnmpTrap-Tools.rar_SNMPtrap

    例如,在 Linux 系统上,你可以使用 `snmptrap` 命令行工具来发送一个自定义的 trap: ```bash snmptrap -v 2c -c public 192.168.1.1 .1.3.6.1.4.1.1.2.3.4 i 12345 ``` 上述命令表示向 IP 地址 192.168.1.1 发送一...

    SNMP++ linux下的环境搭建与编译及测试

    在Linux环境下,SNMP++库提供了C++接口,使得开发人员可以方便地利用SNMP进行应用程序开发。本教程将详细介绍如何在Linux系统中搭建SNMP++的开发环境,进行编译,并进行测试。 1. **安装依赖库** 在开始SNMP++的...

    linux内核,shll功能及其原理介绍.rar

    7. **信号处理**:Shell允许用户处理系统发送的信号,比如通过trap命令设置对特定信号的响应。 了解Shell的工作原理对于Linux系统管理至关重要,它可以帮助我们更高效地利用系统资源,编写自动化脚本,以及理解系统...

    linux总结 解决常见应用问题

    - **修改内容**:取消注释`#Trap CTRL-ALT-DELETE`一行,并启用重启命令,如`#ca::ctrlaltdel:/sbin/shutdown -t3 -r now`。 ##### 8. 修改主机名 - **场景**:当需要更改Linux系统的主机名时。 - **命令**: ```...

    linux shell大全

    10. **错误处理和调试**:学会使用`set`命令设置Shell选项,以及`echo`、`echoerr`和`trap`进行错误处理和脚本调试。 在`Linux shell 命令大全.chm`这个压缩文件中,用户可以找到上述各类命令的详细说明、参数选项...

Global site tag (gtag.js) - Google Analytics