我的编程空间,编程开发者的网络收藏夹
学习永远不晚

shell脚本中如何进行信号的捕捉

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

shell脚本中如何进行信号的捕捉

本篇文章给大家分享的是有关shell脚本中如何进行信号的捕捉,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

trap从字面意思看就是就是陷阱的意思但是在shell脚本中trap时专门捕捉kill -9,kill -15,CTRL+C等信号的。

shell脚本中如何进行信号的捕捉

1、查看所有可用的信号

trap -l或kill -l即可

[root@linux1 ~]# kill -l63) SIGRTMAX-1  64) SIGRTMAX    [root@linux1 ~]# trap -l 1) SIGHUP   2) SIGINT   3) SIGQUIT  4) SIGILL   5) SIGTRAP 6) SIGABRT  7) SIGBUS   8) SIGFPE   9) SIGKILL 10) SIGUSR111) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM......

2、常见的信号如下:

Signal     Value     Comment─────────────────────────────SIGHUP        1      终止进程,特别是终端退出时,此终端内的进程都将被终止SIGINT        2      中断进程,几乎等同于sigterm,会尽可能的释放执行clean-up,释放资源,保存状态等(CTRL+C)SIGQUIT       3      从键盘发出杀死(终止)进程的信号SIGKILL       9      强制杀死进程,该信号不可被捕捉和忽略,进程收到该信号后不会执行任何clean-up行为,所以资源不会释放,状态不会保存SIGTERM      15      杀死(终止)进程,几乎等同于sigint信号,会尽可能的释放执行clean-up,释放资源,保存状态等SIGSTOP      19      该信号是不可被捕捉和忽略的进程停止信息,收到信号后会进入stopped状态SIGTSTP      20      该信号是可被忽略的进程停止信号(CTRL+Z)

真正的信号名字不是SIGXXX,而是去除SIG后的单词,每个信号还有对应的代号

比如向PID为12345的进程发起1信号

kill -1 12345kill -HUB 12345kill -SIGHUB 12345

3、trap的选项

trap -l列出当前系统支持的信号列表,上面已经使用过,根kill -l一样

trap -p等价于trap,查看shell已经布置好的陷阱

可以看到shell默认有三个陷阱,表示忽略20,21,22信号

[root@linux1 ~]# traptrap -- '' SIGTSTPtrap -- '' SIGTTINtrap -- '' SIGTTOU

4、陷阱捕捉到信号后干嘛

  • 忽略信号

  • 捕捉到信号后做相应的处理。主要是清理一些脚本创建的临时文件,然后退出。

5、设置一个可以忽略CTRL+C和15信号的陷阱

CTRL信号对应的是SIGINT 15信号对应的是SIGTERM

[root@linux1 ~]# trap '' SIGINT SIGTERM[root@linux1 ~]# traptrap -- '' SIGINTtrap -- '' SIGTERMtrap -- '' SIGTSTPtrap -- '' SIGTTINtrap -- '' SIGTTOU

这样,当前shell就不能被kill -15杀死

6、设置一个陷阱,捕捉到-15信号时,就打印“我抓到你啦~”

[root@linux1 ~]# trap 'echo "我抓到你啦~"' TERM[root@linux1 ~]# traptrap -- '' SIGINTtrap -- 'echo "我抓到你啦~"' SIGTERMtrap -- '' SIGTSTPtrap -- '' SIGTTINtrap -- '' SIGTTOU

效果,当我对当前bash发起kill -15信号时就打印出来了

[root@linux1 ~]# echo $$8827[root@linux1 ~]# kill -15 8827我抓到你啦~[root@linux1 ~]# kill -15 8827我抓到你啦~[root@linux1 ~]# kill -15 8827我抓到你啦~

7、在脚本中设置一个能忽略CTRL+C和CTRL+Z信号的脚本

CTRL+C是2信号,即SIGINT

CTRL+Z是20信号,即SIGTSTP

脚本:

脚本沉睡10s,然后打印success,脚本忽略INT和TSTP信号

[root@linux1 ~]# cat trap.sh#!/bin/bashtrap '' SIGINT SIGTSTPsleep 10echo success

效果:

CTRL+C也不能阻止我睡觉

[root@linux1 ~]# bash trap.sh ^C^C^Z^Z^C^C^Z^Zccc^Z^Z^Z^C^C^Csuccess

8、布置一个当脚本被终端时能清理垃圾并立即退出脚本的陷阱

脚本如下:

[root@linux1 ~]# cat trap1.sh#!/bin/bashtrap 'echo trap handing...;rm -rf /tmp/$BASHPID;echo TEMP files cleaned;exit' SIGINT SIGTERM SIGQUIT SIGHUPmkdir -p /tmp/$$/touch /tmp/$$/{a..c}.txtsleep 10echo first sleep successsleep 10echo second sleep success

这样,脚本除了SIGKILL信号(kill -9),总能清理掉临时垃圾

效果

刚开始一直不能终止,后来执行了下trap发现前面shell自己设置了一个忽略CTRL+C的陷阱,退出shell重进即可

[root@linux1 ~]# bash trap1.sh ^Ctrap handing...TEMP files cleaned

9、陷阱的守护对象

陷阱的守护对象是shell进程本身,不会守护shell环境内的子进程。但如果是信号忽略型陷阱,则会守护整个shell进程组使其忽略给定信号。

[root@linux1 ~]# cat trap2.sh #!/bin/bashtrap 'echo trap_handle_time: $(date +"%F %T")' SIGINT SIGTERMecho time_start: $(date +"%F %T")sleep 10echo time_end1: $(date +"%F %T")sleep 10echo time_end2: $(date +"%F %T")#执行脚本后,新开终端使用kill -15杀死它[root@linux1 ~]# killall -s SIGTERM trap2.sh#查看输出情况[root@linux1 ~]# ./trap2.sh time_start: 2019-08-27 10:43:48trap_handle_time: 2019-08-27 10:43:58time_end1: 2019-08-27 10:43:58time_end2: 2019-08-27 10:44:08

可以发现,kill执行完后,屏幕没有立即打印trap_handle,而是等sleep 10运行完后才打印的。sleep进程都被忽略型trap守护了

只要是向shell进程发送的信号,都会等待当前正在运行的命令结束后才处理信号,然后继续脚本向下运行。(实际上,只有当shell脚本中正在执行的操作是信号安全的系统调用时,才会出现信号无法中断进程的情况,而在shell下的各种命令,我们是没法直接知道哪些命令中正在执行的系统调用是系统调用的)。

但sleep命令发起的sleep()调用,是一个信号安全的,所以上面脚本中执行sleep的过程中,信号不会直接中断它们的运行,而是等待它运行完之后再执行信号处理命令。

10、如果shell中针对某信号设置了陷阱,则该shell进程接收到该信号时,会等待其内正在运行的命令结束才开始处理陷阱

11、CTRL+C和SIGINT不是等价的。当某一时刻按下CTRL+C,它是在向整个当前运行的进程组发送SIGINT信号。对shell脚本来说,SIGINT不仅发送给shell脚本进程,还发送给脚本中当前正在运行的进程

[root@linux1 ~]# cat trap2.sh #!/bin/bashtrap 'echo trap_handle_time: $(date +"%F %T")' SIGINT SIGTERMecho time_start: $(date +"%F %T")sleep 10echo time_end1: $(date +"%F %T")sleep 10echo time_end2: $(date +"%F %T")#执行脚本后,立马CTRL+C[root@linux1 ~]# bash trap2.sh time_start: 2019-08-27 10:20:53^Ctrap_handle_time: 2019-08-27 10:20:54time_end1: 2019-08-27 10:20:54time_end2: 2019-08-27 10:21:04

可以发现,CTRL+C后,不仅trap进行处理了,sleep也立马结束了;说明CTRL+C不仅让脚本进程收到了SIGINT信号,也让当前进程收到了SIGINT信号

以上就是shell脚本中如何进行信号的捕捉,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

shell脚本中如何进行信号的捕捉

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

shell脚本中如何进行信号的捕捉

本篇文章给大家分享的是有关shell脚本中如何进行信号的捕捉,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。trap从字面意思看就是就是陷阱的意思但是在shell脚本中trap时
2023-06-28

在脚本中如何使用Bash信号捕获

这篇文章将为大家详细讲解有关在脚本中如何使用Bash信号捕获,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Shell 脚本的启动并不难被检测到,但 Shell 脚本的终止检测却并不容易,因为我们无法确定脚
2023-06-15

并行Shell脚本如何验证Linux的互斥信号量

这篇文章主要为大家展示了“并行Shell脚本如何验证Linux的互斥信号量”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“并行Shell脚本如何验证Linux的互斥信号量”这篇文章吧。1 Linu
2023-06-15

“$” 符号如何在Shell 脚本中使用

“$” 符号如何在Shell 脚本中使用?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。通常情况下,在工作中用的最多的有如下几项:$0:Shell 的命令本身1到9:表示 She
2023-06-09

shell脚本中如何执行sql文件

在shell脚本中执行sql文件,可以使用以下命令:mysql -u 用户名 -p密码 数据库名 < 文件名.sql其中,-u表示指定用户名,-p表示需要输入密码,数据库名为要执行sql文件的数据库名称,< 文件名.sql表示从文件中读取
shell脚本中如何执行sql文件
2024-04-09

如何在shell脚本中获取进程ID

这篇文章给大家介绍如何在shell脚本中获取进程ID,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。shell脚本在执行时,会启动子shell的进程。作为主shell的子进程,子shell将shell脚本中的命令作为批处
2023-06-28

如何在 Linux 中运行一个 Shell 脚本

本篇内容介绍了“如何在 Linux 中运行一个 Shell 脚本”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在 Linux 中有两种运行
2023-06-15

Shell 脚本中重复执行如何解决

Shell 脚本中重复执行如何解决,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。简介flock 是文件锁命令,它可以保证Linux系统上进程之间安全的访问临界资源,在shell
2023-06-15

如何使用shell脚本对Nginx日志进行切分

这篇文章将为大家详细讲解有关如何使用shell脚本对Nginx日志进行切分,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。具体如下:1.日志格式默认的日志格式: mainlog_format main $r
2023-06-09

如何在shell中使用expect命令进行远程执行命令脚本

如何在shell中使用expect命令进行远程执行命令脚本?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。expect是用来实现自动交互功能的工具之一,使用expect-send
2023-06-09

如何进行Iptables的脚本分析

这篇文章给大家介绍如何进行Iptables的脚本分析,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。环境:redhat9 加载了string time等模块,加载方法参照 http://bbs.chinaunix.net
2023-06-13

Linux中Shell脚本执行超时如何解决

这期内容当中小编将会给大家带来有关Linux中Shell脚本执行超时如何解决,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。在shell里会有一种不太常见的情况,就是脚本有时候会出现超时的现象。一般来说遇到
2023-06-16

如何进行Python脚本的解析

如何进行Python脚本的解析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。脚本是使用一种特定的描述性语言,因为Python脚本在执行时多了一道翻译的过程,所以
2023-06-17

python中如何对信号进行处理

这篇文章主要介绍了python中如何对信号进行处理,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。什么是信号信号(signal)-- 进程间通讯的一种方式,也可作为一种软件中断
2023-06-20

如何用shell脚本实现监控shell脚本的执行流程及变量的值

本篇内容主要讲解“如何用shell脚本实现监控shell脚本的执行流程及变量的值”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何用shell脚本实现监控shell脚本的执行流程及变量的值”吧!
2023-06-09

如何编写Shell脚本实现对文件中的行、单词、字符进行迭代输出

这篇文章主要介绍“如何编写Shell脚本实现对文件中的行、单词、字符进行迭代输出”,在日常操作中,相信很多人在如何编写Shell脚本实现对文件中的行、单词、字符进行迭代输出问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对
2023-06-09

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录