前言

  当我们在运行某一段代码的时候,希望有类似事物一样的操作,要么成功,要么失败;一般的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. Python进程池使用

    from multiprocessing import Pool from time import sleep def Foo(i): sleep(1) print(i) if __name__ == ...

  2. TCP/IP||UDP广播和多播

    1.概述 广播和多播应用于UDP,TCP是一个面向连接协议,意味着分别运行与两个主机内的两进程间存在一个连接,在考虑多个主机内的共享通信网络,每个以太网帧包含源主机和目的主机以太网地址(48bit), ...

  3. zabbix监控mysql脚本(仅供参考)

    mysql客户端添加 /etc/zabbix/zabbix_agentd.d.userparameter_mysql.conf UserParameter=mysql.version,mysql -V ...

  4. cocos2dx 仿射变换

    AffineTransform __CCAffineTransformMake(float a, float b, float c, float d, float tx, float ty) { Af ...

  5. $CH5302$ 金字塔 区间$DP$/计数类$DP$

    CH Sol f[l][r]表示l到r这段区间对应的金字塔结构种数 发现是f[l][r]是可以由比它小的区间推出来的 比如已知f[l+1][k],f[k+1][r],不难想到f[l][r]+=f[l+ ...

  6. promethues安装

    prometheus 1. 下载安装 下载安装:https://github.com/prometheus/prometheus/releases/tag/v2.9.2 wget https://gi ...

  7. 「SP122」STEVE - Voracious Steve 解题报告

    SP122 STEVE - Voracious Steve 题意翻译 Problem Steve和他的一个朋友在玩游戏,游戏开始前,盒子里有 n个甜甜圈,两个人轮流从盒子里抓甜甜圈,每次至少抓 1个, ...

  8. License for package Android SDK Build-Tools 28.0.3 not accepted

    License for package Android SDK Build-Tools 28.0.3 not accepted 用flutter进行编写时出现了标题的错误,不是配置的原因,而是需要接受 ...

  9. 构造函数以及关键词this

    Java中所有类都有构造方法,用来进行该类对象的初始化,构造方法也有名称,参数和方法体以及访问权限的设定. 1.构造方法的完整定义格式如下: [public|protected|private]< ...

  10. Unity 基于Cinemachine计算透视摄像机在地图中的移动范围

    Unity中Cinemachine的基础功能介绍可详见之前写的博客: https://www.cnblogs.com/koshio0219/p/11820654.html 本篇的重点是讨论,在给定规则 ...