前言

  当我们在运行某一段代码的时候,希望有类似事物一样的操作,要么成功,要么失败;一般的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. Linux基础:CentOS 6重置密码

    1.开机,按"e"键,进入GNU GRUB引导界面,上下键选择中间行 2.按"e"键,进入编辑界面,末行quiet后空格,输入"1"或者&q ...

  2. 关于Qt中窗口的坐标

    主要是给自己以后参考,所以不会太仔细的讲解. #include "mainwindow.h" #include <QApplication> #include<Q ...

  3. jsp页面中如何让一个输入框内的提示文字是灰色而输入的文字是黑色

    <input name="name" type="text"  value="提示的文字" size="30" o ...

  4. $loj6043$ [雅礼集训 $2017\ Day7$] 蛐蛐国的修墙方案 搜索

    正解:搜索 解题报告: 传送门$QwQ$ 首先由$p_i$是一个序列得,每个点的度数为2.且一定形成若干个环. 考虑先对每个环做,发现若要有解必须是偶环,且一定是隔一条边选一条边的,所以对每个环其实只 ...

  5. 洛谷$P2469\ [SDOI2010]$ 星际竞速 网络流

    正解:网络流 解题报告: 传送门$QwQ$ 题目好长昂,,,大概概括下就说有$m$条单向边,$n$个点,每条边有一条边权,每个点有一个点权,然后问每个点都要到达一遍的最小代价是多少$QwQ$? 发现有 ...

  6. 【汇编】1.汇编环境的搭建:DOSBox的安装

    前言 DOSBox是一款在windows系统运行DOS程序的环境模拟器.可以解决在64位机中汇编程序编译调试等问题. 本文以 DOSBox 0.74 为例,汇编编译程序采用MASM6. 第一步下载相关 ...

  7. linux各目录及重要目录的详细介绍

    1 目录说明 根目录 (/) /bin bin是Binary的缩写, 这个目录存放着最经常使用的命令,比如ls,cat,mkdir等 /dev dev是Device(设备)的缩写, 该目录下存放的是L ...

  8. Spring中PropertiesLoaderUtils应用

    FileSystemResource fileSystemResource =new FileSystemResource("D:/home/conf/mail.properties&quo ...

  9. Jquery图片上传功能整理

    最近在做一个图片上传到服务器的功能,之前基本没有什么JS的经验,用的也是网上的插件.做了一个星期才把他弄好,现在做一下总结,方便以后查看. 用的插件是WebUploader,上面有很多例子,我找的例子 ...

  10. Linux之shell编程的基本使用

    1.Shell shell是一个命令行解释器,它为用户提供了一个向 Linux 内核发送请求以便运行程序的系统级程序 2.shell编程打印hello world 2.1 代码部分 #!/bin/ba ...