`

Linux命令之trap - 在脚本中处理信号

 
阅读更多
本文链接:http://codingstandards.iteye.com/blog/836588

用途说明
trap是一个shell内建命令,它用来在脚本中指定信号如何处理。比如,按Ctrl+C会使脚本终止执行,实际上系统发送了SIGINT信号给脚本进程,SIGINT信号的默认处理方式就是退出程序。如果要在Ctrl+C不退出程序,那么就得使用trap命令来指定一下SIGINT的处理方式了。trap命令不仅仅处理Linux信号,还能对脚本退出(EXIT)、调试(DEBUG)、错误(ERR)、返回(RETURN)等情况指定处理方式。
常用参数
       trap [-lp] [[arg] sigspec ...]

格式:trap "commands" signals
当shell接收到signals指定的信号时,执行commands命令。(The  command arg is to be read and executed when the shell receives signal(s) sigspec. )

格式:trap signals
如果没有指定命令部分,那么就将信号处理复原。比如 trap INT 就表明恢复Ctrl+C退出。(If arg is absent (and there is a single sigspec) or -, each specified signal is reset to its  original  disposition  (the value  it  had  upon  entrance  to  the  shell). )

格式:trap "" signals
忽略信号signals,可以多个,比如 trap "" INT 表明忽略SIGINT信号,按Ctrl+C也不能使脚本退出。又如 trap "" HUP 表明忽略SIGHUP信号,即网络断开时也不能使脚本退出。(If arg is the null string the signal specified by each sigspec is ignored by the shell and by the commands it invokes. )

格式:trap -p
格式:trap -p signal
把当前的trap设置打印出来。(If arg is not present and -p  has  been supplied,  then  the trap commands associated with each sigspec are displayed.  If no arguments are supplied or if only -p is given, trap prints the list of commands associated  with  each  signal.)

格式:trap -l
把所有信号打印出来。(The  -l option  causes  the shell to print a list of signal names and their corresponding numbers.  Each sigspec is either a signal name defined in <signal.h>, or a signal number.  Signal names  are  case  insensitive and  the  SIG prefix is optional.)

格式:trap "commands" EXIT
脚本退出时执行commands指定的命令。(If a sigspec is EXIT (0) the command arg is executed on exit from the shell.)

格式:trap "commands" DEBUG
在脚本执行时打印调试信息,比如打印将要执行的命令及参数列表。(If a sigspec is DEBUG, the command arg is executed before every  simple  command,  for  command, case  command,  select command, every arithmetic for command, and before the first command executes in a shell function (see SHELL GRAMMAR above).  Refer to the description of the extdebug option to the  shopt builtin  for  details of its effect on the DEBUG trap.)

格式:trap "commands" ERR
当命令出错,退出码非0,执行commands指定的命令。(If a sigspec is ERR, the command arg is executed whenever a simple command has a non-zero exit status, subject to the following conditions.  The ERR trap is not executed if the failed command is part of the command list immediately following a while or until keyword, part of the test in an if statement, part of a && or ┅Ι│ list, or if the command’s return  value is  being  inverted via !.  These are the same conditions obeyed by the errexit option.)

格式:trap "commands" RETURN
当从shell函数返回、或者使用source命令执行另一个脚本文件时,执行commands指定的命令。(If a sigspec is RETURN, the command arg is executed each time a shell function or a script executed with the . or source    builtins  finishes  executing.   Signals  ignored  upon  entry  to the shell cannot be trapped or reset. Trapped signals that are not being ignored are reset to their original values in a child process when it is created.  The return status is false if any sigspec is invalid; otherwise trap returns true.)

使用示例
示例一
[root@new55 ~]# trap -p
[root@new55 ~]# trap "echo hello" INT
[root@new55 ~]# trap -p
trap -- 'echo hello' SIGINT
[root@new55 ~]# trap -p INT
trap -- 'echo hello' SIGINT
[root@new55 ~]# trap -p QUIT
[root@new55 ~]# Ctrl+C
[root@new55 ~]# hello

[root@new55 ~]#

示例二
[root@new55 ~]# trap -l
1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL
5) SIGTRAP      6) SIGABRT      7) SIGBUS       SIGFPE
9) SIGKILL     10) SIGUSR1     11) SIGSEGV     12) SIGUSR2
13) SIGPIPE     14) SIGALRM     15) SIGTERM     16) SIGSTKFLT
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
[root@new55 ~]#

信号说明
Linux支持的信号列表如下。很多信号是与机器的体系结构相关的

信号值 默认处理动作 发出信号的原因

SIGHUP 1 A 终端挂起或者控制进程终止
SIGINT 2 A 键盘中断(如break键被按下)
SIGQUIT 3 C 键盘的退出键被按下
SIGILL 4 C 非法指令
SIGABRT 6 C 由abort(3)发出的退出指令
SIGFPE 8 C 浮点异常
SIGKILL 9 AEF Kill信号
SIGSEGV 11 C 无效的内存引用
SIGPIPE 13 A 管道破裂: 写一个没有读端口的管道
SIGALRM 14 A 由alarm(2)发出的信号
SIGTERM 15 A 终止信号
SIGUSR1 30,10,16 A 用户自定义信号1
SIGUSR2 31,12,17 A 用户自定义信号2
SIGCHLD 20,17,18 B 子进程结束信号
SIGCONT 19,18,25 进程继续(曾被停止的进程)
SIGSTOP 17,19,23 DEF 终止进程
SIGTSTP 18,20,24 D 控制终端(tty)上按下停止键
SIGTTIN 21,21,26 D 后台进程企图从控制终端读
SIGTTOU 22,22,27 D 后台进程企图从控制终端写

示例三 在脚本中使用
下面的脚本用于检查和启动java程序。
第7行:找出正在运行的符合指定特征的进程;
第11行:如果找到了这样的进程,就杀掉;
第22行:以后台方式启动java程序;
第24行:得到刚启动的程序的pid;
第28行:对SIGTERM信号设置处理方式:结束启动的java程序;
第30行:等待后台进程结束。

Bash代码 
#!/bin/sh  
  
#2007.05.06/07  
# 增加了杀掉LAST_PID功能  
# 增加了脚本退出时杀掉THIS_PID功能  
  
LAST_PID=$(ps -ef|grep 'java.*Zhenjiang'|grep -v grep|awk '{print $2}')  
  
echo "LAST_PID=$LAST_PID"  
  
if [ -n "$LAST_PID" ] &&  [ "$LAST_PID" -gt 0 ]; then  
    echo "LAST PROCESS NOT EXIT, NOW KILL IT!"  
    kill $LAST_PID  
    sleep 1  
fi  
  
if ! cd ../opt/zhenjiang; then  
    echo "CHANGE DIRECTORY FAILED"  
    exit 1  
fi  
  
java -classpath .:./cpinterfaceapi.jar:./log4j-1.2.14.jar:./hyjc.jar:./smj.client.jar Zhenjiang &  
  
THIS_PID=$!  
  
echo "THIS_PID=$THIS_PID"  
  
trap "kill $THIS_PID" TERM  
  
wait  
分享到:
评论

相关推荐

    Linux命令行与shell脚本编程- 控制脚本案例

    通过在脚本中使用`trap`命令,我们可以定义当收到特定信号时要执行的操作,这在需要优雅地关闭程序或清理资源时非常有用。 5. **定时执行脚本**:Linux提供了`cron`服务来进行定时任务。用户可以在`crontab`文件中...

    trapCommand

    `trap` 命令作为 shell 的内置命令之一,在脚本编程中发挥着重要的作用。它主要用于定义如何处理各种信号、脚本退出、调试、错误以及返回等场景。通过 `trap` 命令,开发者可以有效地控制脚本在遇到特定事件时的行为...

    linux shell脚本攻略-高清

    如何通过set命令来启用或禁用各种Shell选项,以及如何使用trap命令处理信号,都是开发者需要掌握的重要技能。 在实际应用中,Shell脚本经常用于系统管理和自动化任务,例如备份、日志分析、监控等。攻略中可能会...

    [Linux]Shell脚本编程详解

    在Linux操作系统中,Shell脚本是一种强大的自动化工具,它允许用户通过编写一系列命令来执行复杂的任务。这篇文章将深入探讨Shell脚本编程的基础知识,包括语法、常用命令以及如何创建和运行自定义脚本。 1. Shell...

    linux下的特殊命令

    - `trap`:捕获并处理信号,例如在脚本退出时清理资源。 2. **网络存储技术**: - **NAS(Network Attached Storage)**:通过网络接口直接访问的存储设备,提供文件级访问。 - **SAN(Storage Area Network)**...

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

    6. 错误处理:`set -e`使脚本在遇到错误时立即退出,`trap`捕获并处理信号。 此外,本书还可能涵盖了高级主题,如管道(`|`)和重定向(`&gt;&gt;`, `&&gt;`, `2&gt;&1`)的使用,正则表达式,函数库,环境变量,以及如何调试和...

    linux运维.doc

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

    linux异常测试脚本合计

    1. 错误处理:使用`if`语句或`trap`命令捕获和处理异常,确保脚本在遇到错误时能优雅地退出,而不是突然停止。 2. 日志记录:通过`echo`或`logger`命令记录测试过程和结果,方便后期分析和调试。 3. 使用信号:通过...

    linux 命令及shell编程

    在IT领域,Linux操作系统及其...通过熟练掌握这些Linux命令和Shell编程技巧,你可以更加高效地在Linux环境中工作,无论是日常维护还是自动化任务,都能得心应手。不断实践和学习,你将成为Linux操作系统的驾驭者。

    Linux脚本攻略

    11. **陷阱(Trap)**:了解如何在特定信号发生时执行指定的命令,以实现优雅的脚本退出。 12. **数组**:虽然Bash支持的数组功能相对有限,但学习如何使用和操作数组对于复杂脚本至关重要。 13. **别名和函数**:...

    linux命令(脚本顺序控制)1

    在Linux系统中,掌握命令行脚本的顺序控制是至关重要的,这关乎到自动化任务的执行效率和可靠性。本文将详细讲解几种常见的控制结构:`esac`、`for`、`while`循环,以及相关的条件判断和信号处理。 首先,`esac`...

    C语言中文网shell脚本教程

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

    linux_shell脚本经典入门

    还有可能涵盖高级话题,如进程管理(子进程、父进程通信)、陷阱(trap)和信号处理,以及脚本的安全性和权限设置。 在实际应用中,Shell脚本广泛用于系统管理、自动备份、日志分析、持续集成等场景。掌握Shell脚本...

    shell命令精品教程-下

    信号处理涉及`trap`命令,它可以捕捉并响应特定信号,如优雅地终止脚本或执行清理工作。 五、正则表达式与字符串操作 在Shell中,`grep`, `egrep`, `awk`等工具常用于匹配和处理文本。正则表达式提供了一种强大的...

    Linux Shell调试技术

    在这个示例中,`trap`命令被用来捕获`DEBUG`信号,即在脚本中的每条命令执行前触发。通过这种方式,我们可以看到脚本执行过程中的变量变化情况,有助于理解和追踪代码的执行流程。 ##### 3. `tee`命令 除了`trap`...

    LINUX+SHELL脚本攻略中文版

    Linux Shell脚本攻略是Linux系统管理员和开发者必备的技能之一,它允许用户通过编写命令行脚本来自动化重复性任务,提高工作效率。Shell脚本本质上是解释执行的Bash(Bourne-Again SHell)程序,是Linux环境下的...

    shell命令/shell脚本编写教程

    7. 错误处理:`set -e`使脚本在遇到错误时立即退出,`trap`用于捕获并处理信号。 三、高级Shell编程技巧 1. 赋值运算符:`=`, `+=`, `*=`, `==`, `!=`等,以及数组的使用。 2. 引用和转义:了解`$`引用变量,`\`...

    Linux从入门到实战学习教程-9Shell脚本编程基础.pptx

    `trap`命令可以捕获并处理信号,帮助追踪脚本中的错误。 通过学习这些基本概念,你可以开始编写简单的Shell脚本,解决日常的自动化任务。随着经验的积累,你将能够编写出更复杂的脚本来管理文件系统、监控系统状态...

    LinuxBash脚本编程大全

    11. **错误处理**:学习如何使用set -e和trap命令来处理脚本运行时的错误和信号。 12. **脚本调试**:掌握set -x和set -v选项,用于输出脚本执行的详细过程,便于调试。 13. **文件与权限**:学习文件和目录的操作...

    Linux命令行与shell脚本编程大全案例.zip

    - **Shell内置命令**:如`read`读取用户输入,`source`执行脚本内容,`trap`捕获并处理信号。 - **正则表达式**:在脚本中进行模式匹配和查找替换。 - **别名与函数**:创建命令别名简化命令输入,编写功能函数...

Global site tag (gtag.js) - Google Analytics