Shell之信号捕获
前言
当我们在运行某一段代码的时候,希望有类似事物一样的操作,要么成功,要么失败;一般的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之信号捕获的更多相关文章
- shell编程之服务脚本编写,文件锁以及信号捕获
shell脚本编程是linux运维工程师必备的技能,也是非常重要的一个技能,所以把shell编程学好,只有好处.基础语法我也就不讲了,学过C语言这些语言的,稍微看一下就能明白shell编程的基础,所以 ...
- Linux Shell脚本编程-信号捕获
bash编程的信号捕获: kill -l 显示当前系统可用信号(trap -l) 获取帮助:man 7 single 常用信号: 1) SIGHUP 无须重启进程而让其重读配置文件 2) SI ...
- bash编程的信号捕获:
bash编程的信号捕获: kill -l KILL无法捕捉: trap 'COMMAND' SIGNAL, 信号捕捉用于:在中途中止时做一些清理操作. 一. trap捕捉到信号之后,可以 ...
- shell中trap捕获信号
信号是一种进程间通信机制,它给应用程序提供一种异步的软件中断,使应用程序有机会接受其他程序活终端发送的命令(即信号).应用程序收到信号后,有三种处理方式:忽略,默认,或捕捉.进程收到一个信号后,会检查 ...
- Linux下shell脚本中信号捕获和函数练习脚本之ping一个网段
该脚本主要的目的是练习在Linux bash脚本中捕获信号,顺便练习一下函数的使用,还有就是终止一个正在运行的程序后,该程序打开的文件的后续处理问题等等!脚本功能: ping一个网段内的IP,检测哪 ...
- Shell Trap信号管理
trap命令用于指定在接收到信号后将要采取的动作.常见的用途是在脚本程序被中断时完成清理工作.不过,这次我遇到它,是因为客户有个需求:从终端访问服务器的用户,其登陆服务器后会自动运行某个命令,例如打开 ...
- cxx signal信号捕获
kill -9 [pid] 该信号不能被捕获 #include <iostream> #include <csignal> static void vSignalHandler ...
- [Go] gocron源码阅读-groutine与channel应用到信号捕获
直接使用go 函数名()可以开启一个grountine,channel可以接收信息并且如果没有数据时会阻塞住channel对应的是底层数据结构的引用,复制channel和函数传参都是拷贝的引用make ...
- Shell 语法之信号与作业
Linux 使用信号与系统上运行的进程进行通信. Linux 编程中最常见的 Linux 系统信号 信号 值 描述 1 SIGHUP 挂起进程 2 SIGINT 中断进程 3 SIGQU ...
随机推荐
- 解决Win10电脑右下角的“激活windows转到电脑设置”的水印的方法
Win10正式版的用户反馈新系统在使用一段时候后,自己电脑桌面右下角就突然出现了“激活windows10转到设置以激活windows”的水印字样.这是怎么回事呢?下面,我就向大家分享win10电脑右下 ...
- javaweb-实现不同用户登录后跳转到不同界面
今天下午,实现了公文流转系统的一小部分——登录界面验证不同用户跳转到不同界面 Dao package com.office.Dao; import java.sql.Connection; impor ...
- 机器学习——Bagging与随机森林算法及其变种
Bagging算法: 凡解:给定M个数据集,有放回的随机抽取M个数据,假设如此抽取3组,3组数据一定是有重复的,所以先去重.去重后得到3组数据,每组数据量分别是s1,s2,s3,然后三组分别训练组合 ...
- HashMap 原理解析
HashMap是由数组加链表的结合体.如下图: 图中可以看出HashMap底层就是一个数组结构,每个数组中又存储着链表(链表的引用) JDK1.6实现hashmap的方式是采用位桶(数组)+链表的方式 ...
- SpringBoot入门简易教程
使用SpringBoot来开发一个简单的restful api网关功能,目标:实现对SpringBoot的简单入门. 1. 创建SpringBoot项目 可以通过spring官网(https://st ...
- 【一起学源码-微服务】Nexflix Eureka 源码四:EurekaServer启动之完成上下文构建及EurekaServer总结
前言 上篇文章已经介绍了 Eureka Server上下文创建相关的Eureka Client逻辑,这一部分还是比较复杂的.接下来就讲解下Eureka Server上下文初始化最后的部分,然后加上整个 ...
- spring boot的application配置文件
上次我们已经对这个文件见过面了,并且对他进行了一些简单的配置.它有两种配置方式,一个是application.properties,一个是application.yml文件,需要记住,当两个文件都 ...
- mybatis两种方式
// 1.传统的使用 statementId方式 //获取详情 sysApiDocumentMode = template.selectOne("oaApiDocument.getProje ...
- 拥有 GitHub 开源项目的小伙伴,免费申请 JetBrains 全家桶的全流程详解
工欲善其事,必先利其器.如果您想要学习 Java.PHP.Ruby.Python.JavaScript.Objective-C..NET 中的任何一种开发技术,国际知名且屡获殊荣的 JetBrains ...
- linux死机解决办法
linux死机后不要长按电源建强制关机,容易对损坏系统配置或者电脑硬件,导致重启后产生不必要的麻烦 如果是在图形界面下死机的话,不要再依赖任何图形界面的工具,解决方法如下: 1.一种方式是进入终端界面 ...