- 浏览: 4754525 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
bzhao:
你也应该可以这样:(not tested)./rbtunnel ...
在Bash脚本中怎么关闭文件描述符? -
bzhao:
如果有A进程原代码情况下,通过如下调用,把他的子进程继承关闭则 ...
在Bash脚本中怎么关闭文件描述符? -
Master-Gao:
楼主咋没分析下源码呢?
我使用过的Linux命令之dirname - 截取给定路径的目录部分 -
jiedushi:
tail -F 就可以吧
Linux下实时跟踪log4j日志文件的bash脚本 - 增强了tail -f的功能 -
java_is_new:
新手学习了,就是不明白为一个网卡配多个ip有什么用
我使用过的Linux命令之ifconfig - 网络配置命令
我使用过的Linux命令之trap - 在脚本中处理信号
本文链接:http://codingstandards.iteye.com/blog/836588 (转载请注明出处)
用途说明
rap是一个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 8) 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 ~]#
示例三 在脚本中使用
下面的脚本用于检查和启动java程序。
第7行:找出正在运行的符合指定特征的进程;
第11行:如果找到了这样的进程,就杀掉;
第22行:以后台方式启动java程序;
第24行:得到刚启动的程序的pid;
第28行:对SIGTERM信号设置处理方式:结束启动的java程序;
第30行:等待后台进程结束。
#!/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
问题思考
相关资料
【1】Leo linux trap命令
【2】ME [原]linux下的trap命令
【3】Linux宝库 在shell中捕捉信号的trap命令
【4】ubuntuer zone linux trap详解
发表评论
-
在Linux用tar归档压缩文件时忽略某些文件和目录
2013-02-01 10:19 17053在Linux下,常用tar对文 ... -
使用nmap扫描服务器端口的一次操作
2012-11-01 17:00 15142使用nmap扫描服务器端口的一次操作 本文来自:http ... -
我使用过的Linux命令之wget - ooo
2011-09-14 13:10 0我使用过的Linux命令之wg ... -
推荐一篇学习Vim使用的好文:酷壳 - 简明 Vim 练级攻略
2011-09-09 12:53 9150简明 Vim 练级攻略 http://coolshell.c ... -
推荐一篇学习Vim使用的好文:酷壳 - 简明 Vim 练级攻略
2011-09-09 12:49 1简明 Vim 练级攻略 http://coolshell.c ... -
我使用过的Linux命令之:(冒号) - 啥也不做(除了……)
2011-08-29 13:18 12101我使用过的Linux命令之: ... -
我使用过的Linux命令之date - 显示、修改系统日期时间
2011-08-25 09:21 41985我使用过的Linux命令之da ... -
我使用过的Linux命令之declare - 声明shell变量(不知道没关系、知道了就更好的内建命令)
2011-08-16 09:22 21833我使用过的Linux命令之declare - 声明shell变 ... -
我使用过的Linux命令之alias - 设置命令的别名,让 Linux 命令更简练
2011-08-11 09:31 28829我使用过的Linux命令之alias - 设置命令的别名,让 ... -
我使用过的Linux命令之ar - 创建静态库.a文件
2011-08-08 10:40 51934我使用过的Linux命令之ar - 创建静态库.a文件 本 ... -
我使用过的Linux命令之crontab - 设置例行任务(类似于Windows中的任务计划)
2011-08-04 22:26 9752我使用过的Linux命令之crontab - 设置例行任务(类 ... -
我使用过的Linux命令之chmod - 改变文件/目录的访问权限
2011-08-03 21:33 10706我使用过的Linux命令之chmod - 改变文件/目录的访问 ... -
我使用过的Linux命令之export - 设置或显示环境变量
2011-08-02 19:55 25441我使用过的Linux命令之export - 设置或显示环境变量 ... -
我使用过的Linux命令之wc - 统计文件行数、单词数或字节数
2011-07-26 10:50 29019我使用过的Linux命令之wc - 统计文件行数、单词数或字节 ... -
我使用过的Linux命令之groupdel - 删除群组
2011-07-22 22:13 9693我使用过的Linux命令之gr ... -
我使用过的Linux命令之ifconfig - 网络配置命令
2011-07-21 20:43 60556我使用过的Linux命令之ifconfig - 网络配置命令 ... -
我使用过的Linux命令之ll - 列出文件/目录的详细信息
2011-07-20 21:22 7209我使用过的Linux命令之ll ... -
我使用过的Linux命令之mkdir - 创建目录
2011-07-20 20:58 13688我使用过的Linux命令之mkdir - 创建目录 本文链 ... -
我使用过的Linux命令之perror - 解释错误代码
2011-07-18 20:29 25082我使用过的Linux命令之perror - 解释错误代码 ... -
我使用过的Linux命令之ping - 测试与目标主机的连通性
2011-07-16 10:46 26616我使用过的Linux命令之ping - 测试与目标主机的连通性 ...
相关推荐
通过在脚本中使用`trap`命令,我们可以定义当收到特定信号时要执行的操作,这在需要优雅地关闭程序或清理资源时非常有用。 5. **定时执行脚本**:Linux提供了`cron`服务来进行定时任务。用户可以在`crontab`文件中...
`trap` 命令作为 shell 的内置命令之一,在脚本编程中发挥着重要的作用。它主要用于定义如何处理各种信号、脚本退出、调试、错误以及返回等场景。通过 `trap` 命令,开发者可以有效地控制脚本在遇到特定事件时的行为...
如何通过set命令来启用或禁用各种Shell选项,以及如何使用trap命令处理信号,都是开发者需要掌握的重要技能。 在实际应用中,Shell脚本经常用于系统管理和自动化任务,例如备份、日志分析、监控等。攻略中可能会...
在Linux操作系统中,Shell脚本是一种强大的自动化工具,它允许用户通过编写一系列命令来执行复杂的任务。这篇文章将深入探讨Shell脚本编程的基础知识,包括语法、常用命令以及如何创建和运行自定义脚本。 1. Shell...
Linux运维云计算服务器管理指南 ...我们学习了 Linux 服务器类型、网络配置、Apache 服务器安装、RPM 包管理、Yum 软件管理、sed 高级用法、Trap 信号处理、文件管理、diff 和 patch 命令等方面的内容。
- `trap`:捕获并处理信号,例如在脚本退出时清理资源。 2. **网络存储技术**: - **NAS(Network Attached Storage)**:通过网络接口直接访问的存储设备,提供文件级访问。 - **SAN(Storage Area Network)**...
《Linux系统命令及Shell脚本实践指南》是针对Linux操作系统用户和管理员的一份宝贵资源,旨在帮助读者深入理解和熟练运用Linux环境中的基本命令以及编写高效Shell脚本。这份指南覆盖了从基础到高级的广泛主题,是...
1. 错误处理:使用`if`语句或`trap`命令捕获和处理异常,确保脚本在遇到错误时能优雅地退出,而不是突然停止。 2. 日志记录:通过`echo`或`logger`命令记录测试过程和结果,方便后期分析和调试。 3. 使用信号:通过...
11. **陷阱(Trap)**:了解如何在特定信号发生时执行指定的命令,以实现优雅的脚本退出。 12. **数组**:虽然Bash支持的数组功能相对有限,但学习如何使用和操作数组对于复杂脚本至关重要。 13. **别名和函数**:...
在IT领域,Linux操作系统及其...通过熟练掌握这些Linux命令和Shell编程技巧,你可以更加高效地在Linux环境中工作,无论是日常维护还是自动化任务,都能得心应手。不断实践和学习,你将成为Linux操作系统的驾驭者。
.html`和`3.19Linux Shell trap命令:捕获信号.html`、`3.20Linux Shell trap命令捕获信号实例演示.html`将介绍Linux中的信号机制,这是一种进程间通信方式,用于通知进程某些事件的发生。trap命令允许我们定义当...
Linux Shell脚本是Linux系统中用于自动化任务的强大工具,它基于Bash或其他Shell解释器,允许用户编写可执行的命令序列。本入门教程将引导你深入理解Shell脚本的精髓,帮助你提升在Linux环境中的工作效率。 首先,...
在Linux系统中,掌握命令行脚本的顺序控制是至关重要的,这关乎到自动化任务的执行效率和可靠性。本文将详细讲解几种常见的控制结构:`esac`、`for`、`while`循环,以及相关的条件判断和信号处理。 首先,`esac`...
在这个示例中,`trap`命令被用来捕获`DEBUG`信号,即在脚本中的每条命令执行前触发。通过这种方式,我们可以看到脚本执行过程中的变量变化情况,有助于理解和追踪代码的执行流程。 ##### 3. `tee`命令 除了`trap`...
11. **错误处理**:学习如何使用set -e和trap命令来处理脚本运行时的错误和信号。 12. **脚本调试**:掌握set -x和set -v选项,用于输出脚本执行的详细过程,便于调试。 13. **文件与权限**:学习文件和目录的操作...
在IT行业中,Shell脚本是Linux/Unix操作系统中不可或缺的一部分,它是一种强大的自动化工具,能够帮助用户执行一系列命令,简化日常任务。这个“shell命令/shell脚本编写教程”涵盖了如何在Linux或BSD环境下有效利用...
Linux Shell脚本攻略是Linux系统管理员和开发者必备的技能之一,它允许用户通过编写命令行脚本来自动化重复性任务,提高工作效率。Shell脚本本质上是解释执行的Bash(Bourne-Again SHell)程序,是Linux环境下的...
`trap`命令可以捕获并处理信号,帮助追踪脚本中的错误。 通过学习这些基本概念,你可以开始编写简单的Shell脚本,解决日常的自动化任务。随着经验的积累,你将能够编写出更复杂的脚本来管理文件系统、监控系统状态...
信号处理涉及`trap`命令,它可以捕捉并响应特定信号,如优雅地终止脚本或执行清理工作。 五、正则表达式与字符串操作 在Shell中,`grep`, `egrep`, `awk`等工具常用于匹配和处理文本。正则表达式提供了一种强大的...
5. **脚本调试与错误处理**:如何设置调试选项,追踪脚本运行过程中的问题,以及异常处理机制,如陷阱(trap)的设置。 6. **函数库和模块化编程**:如何组织和复用代码,创建自定义函数库,提高脚本的可维护性和可...