前言

  当我们在运行某一段代码的时候,希望有类似事物一样的操作,要么成功,要么失败;一般的shell脚本都是自上而下,从左之后运行,碰到异常信号就会出错,从而终止脚本的运行,这个时候脚本可能运行到某一处数据写入操作的时候,强迫停止,从而造成重大失误,trap可能帮助我们尽量减少这个问题,记住是尽量减少,不等于全部避免。

trap

  允许你监听指定的信号,并对相应的信号做出对应的反应;

格式

trap commands signals
注意:这里的commands就是在捕获signals信号之后做出的相应反应;捕获信号可以用来做防御操作,也可以用来做进攻操作。

选项

-l     列出trap的相关信号

Linux信号大全

 ) SIGHUP       ) SIGINT       ) SIGQUIT      ) SIGILL
) SIGTRAP ) SIGABRT ) SIGBUS ) SIGFPE
) SIGKILL ) SIGUSR1 ) SIGSEGV ) SIGUSR2
) SIGPIPE ) SIGALRM ) SIGTERM ) SIGSTKFLT
) SIGCHLD ) SIGCONT ) SIGSTOP ) SIGTSTP
) SIGTTIN ) SIGTTOU ) SIGURG ) SIGXCPU
) SIGXFSZ ) SIGVTALRM ) SIGPROF ) SIGWINCH
) SIGIO ) SIGPWR ) SIGSYS ) SIGRTMIN
) SIGRTMIN+ ) SIGRTMIN+ ) SIGRTMIN+ ) SIGRTMIN+
) SIGRTMIN+ ) SIGRTMIN+ ) SIGRTMIN+ ) SIGRTMIN+
) SIGRTMIN+ ) SIGRTMIN+ ) SIGRTMIN+ ) SIGRTMIN+
) SIGRTMIN+ ) SIGRTMIN+ ) SIGRTMIN+ ) SIGRTMAX-
) SIGRTMAX- ) SIGRTMAX- ) SIGRTMAX- ) SIGRTMAX-
) SIGRTMAX- ) SIGRTMAX- ) SIGRTMAX- ) SIGRTMAX-
) SIGRTMAX- ) SIGRTMAX- ) SIGRTMAX- ) SIGRTMAX-
) SIGRTMAX- ) SIGRTMAX

trap常见的几种操作

trap "commands" signal-list     # 当脚本收到signal-list清单内列出的信号时,trap命令执行双引号中的命令。
trap signal-list # trap不指定任何命令,接受信号的默认操作,默认操作是结束进程的运行。
trap " " signal-list # trap命令指定一个空命令串,允许忽视信号,我们常用到的就是这一种。
trap -- signal-list # 删除trap的捕获动作

注意:请记住,脚本程序通常是以从上到下的顺序解释执行的,所以必须在你想保护的那部分代码以前指定trap命令,在不想保护的部分,添加删除捕获动作;

示例1

#!/bin/bash
# test trap command
trap "echo 'Sorry! I have trapped Ctrl-C'" SIGINT echo This is a test script count=
while [ $count -le ]
do
echo "Loop $count"
sleep
count=$[ $count + ]
done echo The end.

运行结果

This is a test script
Loop
Loop
^CSorry! I have trapped Ctrl-C
Loop
Loop
^CSorry! I have trapped Ctrl-C
Loop
Loop
Loop
Loop
^CSorry! I have trapped Ctrl-C
Loop
Loop
The end.

示例2

#!/bin/bash
# 除了在shell脚本中捕获信号外,也可以在shell退出时捕获,在trap命令后加上EXIT信号就行。
# test trap command
trap "echo Goodbye." EXIT echo This is a test script count=
while [ $count -le ]
do
echo "Loop $count"
sleep
count=$[ $count + ]
done echo The end.

运行结果

This is a test script
Loop
Loop
Loop
Loop
Loop
Loop
Loop
Loop
Loop
Loop
The end.
Goodbye.

示例3

#!/bin/bash
# 修改trap操作
# test trap command trap "echo 'Sorry! I have trapped Ctrl-C'" SIGINT count=
while [ $count -le ]
do
echo "Loop $count"
sleep
count=$[ $count + ]
done trap "echo 'Sorry! The trap has been modified.'" SIGINT count=
while [ $count -le ]
do
echo "Loop $count"
sleep
count=$[ $count + ]
done echo The end.

运行结果:

Loop
Loop
Loop
^CSorry! I have trapped Ctrl-C
Loop
Loop
Loop
Loop
Loop
^CSorry! The trap has been modified.
Loop
Loop
The end.

示例4

#!/bin/bash
trap "echo 'Sorry! This is FOR!'" SIGINT
for ((i=; i<=; i++))
do
echo "$i"
sleep 0.1
done trap -- SIGINT for ((i=; i<=; i++))
do
echo "$i"
sleep 0.1
done

运行结果:


^CSorry! This is FOR!

^CSorry! This is FOR!

^C

信号翻译地址:https://www.linux.org/threads/kill-signals-and-commands-revised.11625/
信号参考地址:https://www.cnblogs.com/guge-94/p/11016176.html
参考学习地址:https://www.jianshu.com/p/b26d4e520385(感谢大佬写的简述,通俗易懂,让后辈学习!)

Shell之信号捕获的更多相关文章

  1. shell编程之服务脚本编写,文件锁以及信号捕获

    shell脚本编程是linux运维工程师必备的技能,也是非常重要的一个技能,所以把shell编程学好,只有好处.基础语法我也就不讲了,学过C语言这些语言的,稍微看一下就能明白shell编程的基础,所以 ...

  2. Linux Shell脚本编程-信号捕获

    bash编程的信号捕获:  kill -l 显示当前系统可用信号(trap -l)  获取帮助:man 7 single 常用信号: 1) SIGHUP  无须重启进程而让其重读配置文件  2) SI ...

  3. bash编程的信号捕获:

    bash编程的信号捕获: kill -l KILL无法捕捉:   trap 'COMMAND' SIGNAL,    信号捕捉用于:在中途中止时做一些清理操作.   一. trap捕捉到信号之后,可以 ...

  4. shell中trap捕获信号

    信号是一种进程间通信机制,它给应用程序提供一种异步的软件中断,使应用程序有机会接受其他程序活终端发送的命令(即信号).应用程序收到信号后,有三种处理方式:忽略,默认,或捕捉.进程收到一个信号后,会检查 ...

  5. Linux下shell脚本中信号捕获和函数练习脚本之ping一个网段

    该脚本主要的目的是练习在Linux bash脚本中捕获信号,顺便练习一下函数的使用,还有就是终止一个正在运行的程序后,该程序打开的文件的后续处理问题等等!脚本功能:  ping一个网段内的IP,检测哪 ...

  6. Shell Trap信号管理

    trap命令用于指定在接收到信号后将要采取的动作.常见的用途是在脚本程序被中断时完成清理工作.不过,这次我遇到它,是因为客户有个需求:从终端访问服务器的用户,其登陆服务器后会自动运行某个命令,例如打开 ...

  7. cxx signal信号捕获

    kill -9 [pid] 该信号不能被捕获 #include <iostream> #include <csignal> static void vSignalHandler ...

  8. [Go] gocron源码阅读-groutine与channel应用到信号捕获

    直接使用go 函数名()可以开启一个grountine,channel可以接收信息并且如果没有数据时会阻塞住channel对应的是底层数据结构的引用,复制channel和函数传参都是拷贝的引用make ...

  9. Shell 语法之信号与作业

    Linux 使用信号与系统上运行的进程进行通信. Linux 编程中最常见的 Linux 系统信号 信号 值   描述 1  SIGHUP  挂起进程 2  SIGINT  中断进程 3  SIGQU ...

随机推荐

  1. 彩票历史记录分析工具 -- 通过实例学习wpf开发

    前言 虽然本人对彩票不感兴趣,仍然有不少人对此情有独钟.他们花大量时间精力去分析彩票的历史记录,企图发现规律,为下一次投注做指导,希望“赢的“”概率增大.不管研究历史记录是否有意义,我用软件实现了对彩 ...

  2. 第二阶段:2.商业需求文档MRD:1.M版本管理

    版本管理的例子.V=Version.注意大中小版本的区分.V1.2.2 第一个数字1就是大版本 中间的2就是中版本 末尾的2就是小版本.大版本就是方向的变更,比如我的用户之前主要是面向男性,现在要面向 ...

  3. 记springboot + MP +Hikari动态数据源配置

    环境准备: springboot 2.1.6 mybatis-plus 数据库驱动 boot 自带hikari驱动 步骤1:  导入多数据源启动工具类 <!-- 多数据源支持 -->< ...

  4. [梁山好汉说IT] 区块链在梁山的应用

    [梁山好汉说IT] 区块链在梁山的应用 0x00 摘要 区块链属于一种去中心分布式数据存储系统,有其擅长的应用场景,也有其缺点. 下面用梁山为例来阐释下区块链部分概念&应用. 0x01 梁山好 ...

  5. 深入ThreadLocal的底层实现机制以及对应的使用风险

    学习Java中常用的开源框架,Mybatis.Hibernate中线程通过数据库连接对象Connection,对其数据进行操作,都会使用ThreadLocal类来保证Java多线程程序访问和数据库数据 ...

  6. form表单提交方式实现浏览器导出Excel

    刚开始使用ajax做Excel导出,发现ajax做不了浏览器导出只能下载到本地,于是用form提交可以提供浏览器下载Excel. 1>用ajax做本地下载: FileOutputStream f ...

  7. Python学习3月5号【python编程 从入门到实践】---》笔记(3)

    第五章 1.if 语句 一.(条件测试)::每条if语句的核心都是一个值为true或false的表达式,这种表达式被称为条件测试.Python根据条件测试的值为True或者False来决定是否执行if ...

  8. xshell连接不上ubuntu---could not connect to 'ip' (port 22): Connection failed.

    可能是没有开启ssh server,接下来就是开启服务就好.命令如下: sudo apt-get install openssh-server 这样就OK啦

  9. 【题解】CF894E Ralph and Mushrooms (缩点)

    [题解]CF894E Ralph and Mushrooms (缩点) 这是紫?给个解方程算法 考虑一条边若可以重复遍历说明一定有环,有环的话一定会把环上的蘑菇榨干,考虑一条边从全部到榨干的贡献是多少 ...

  10. Linux上查找最大文件的 3 种方法

    有时候我们在系统上安装了数十个应用程序,随着使用时间的推移,许多文件变得越来越大,从而导致磁盘空间越来越小.那么问题来了,如何找到系统上这些大文件,然后进行一番磁盘空间清理呢,这篇文章就此介绍几种查找 ...