shell中的信号捕获trap(shell 进阶)

简介: shell中的信号捕获trap(shell 进阶)

9bf92a34243c44e8b01aead116859856.png

trap的基础概念

定义一个trap

[root@15:14:15 /opt/shellTest]#trap -p
[root@15:14:17 /opt/shellTest]#
[root@15:14:18 /opt/shellTest]#
[root@15:14:18 /opt/shellTest]#trap 'echo traped' INT
[root@15:18:06 /opt/shellTest]#
[root@15:18:07 /opt/shellTest]#
[root@15:18:07 /opt/shellTest]#trap -p
trap -- 'echo traped' SIGINT

这个意思就是说当按下Ctrl +c 时输出 traped

可以以列表的形式去定义9c085da632eb49fa8cdc2434fc300a51.png

忽略信号

忽略TERM信号

452cb0b7fcd645b394441e69018fe5fc.png忽略INT信号

重置信号51efa59d0956458fa31e96b3568d916f.png

trap的实例

清理临时文件

经常在脚本中会创建文件然后执行结束之后删除,但是当脚本在删除前发生异常,则就会有临时文件产生。如何解决这个问题呢?

捕获异常并触发删除脚本达到此目的。

#!/bin/bash
trap 'echo traped;rm -rf $tmp_dir;exit 1' INT HUP QUIT TERM
tmp_dir=/tmp/$BASHPID
mkdir -p $tmp_dir
touch $tmp_dir/{a..d}.log
echo "$tmp_dir"
ls -l $tmp_dir
sleep 5s
rm -rf $tmp_dir
echo "over"

注意可以使用trap 'echo traped;rm -rf $tmp_dir;exit 1' EXIT

但是不推荐,因为需要程序员去考虑EXIT是哪种退出,而INT HUP QUIT TERM是明确的退出信号。

一般trap的action中要exit 1. 这个是退出状态码,可以自己定义并作出相应的动作,例如报警...

清理脚本中的后台进程

当脚本脱离终端运行后,即使你发送INT信号,还是会一直输出。

看一个小例子

#!/bin/bash
while true;do
sleep 1s
echo hhahha
done & 
sleep 3

主进程等待3s之后,将while true进行后台运行。即使发送INT信号也没有用。使用killall bash才可以停下。

此处需要注意一定要取消刚才定义的trap TERM才能生效。

#!/bin/bash
function signal_hangdle {
        echo trapped
        kill $pid
        exit 1
}
#trap  'signal_handle' EXIT
sleep 10s &
pid=$!
sleep 20s &
pid="$! $pid"
sleep 5s
~                                                                               
~               

结果:

使用trap INT的结果:eb53cf2f067544d18268bdd3dfc68118.pngtrap EXIT:

问题点: 脚本中需要不断收集进程id,如果有10个sleep那就需要收集后台进程ID。

man一下kill 的用法 0 代表进程组,那直接kill 0就可以免去收集后台进程ID

结果:

采坑点

快捷键:CTRL+(C、Z、\):对于脱离了终端的后台进程无效

接收到信号后,会等待正在执行的前台任务完成后去触发信号处理程序。原因是:shell认为前台进程都是重要任务

f2a6aefc538c429e9ebdbb9834364900.png

信号守护的范围

CTRL+C和SIGINT不等价:前者发INT给shell及其内所有子进程,后者只发送给shelle66220a8e73e45c8aa1be561b7e54f1a.png

目录
相关文章
|
Unix Shell Linux
Shell 内置命令:trap
Shell 内置命令:trap
217 1
|
Shell Linux
Linux Shell 进阶:探索高级命令和脚本编程技巧
Linux Shell不仅仅是一个命令解释器,它还提供了许多强大的高级命令和脚本编程技巧,能够帮助用户更高效地管理系统和处理数据。在这篇文章中,我们将深入探讨Linux Shell的高级功能。
220 0
|
6月前
|
监控 Shell Linux
【Shell 命令集合 系统管理 】⭐⭐⭐Linux 向进程发送信号 kill命令 使用指南
【Shell 命令集合 系统管理 】⭐⭐⭐Linux 向进程发送信号 kill命令 使用指南
95 0
|
Shell Linux
shell脚本学习-进阶
shell脚本学习-进阶
67 0
|
6月前
|
存储 Shell Linux
第九章 Shell信号发送与捕捉
第九章 Shell信号发送与捕捉
|
6月前
|
安全 Shell Linux
【Shell 命令集合 系统管理 】Linux 终止或向进程发送信号 skill命令 使用指南
【Shell 命令集合 系统管理 】Linux 终止或向进程发送信号 skill命令 使用指南
86 0
|
6月前
|
Shell Linux
在Linux Shell中,信号
在Linux Shell中,信号
39 1
|
运维 监控 应用服务中间件
【运维知识高级篇】34道Shell编程练习题及答案(从基础到实战:基础+计算+判断+循环+控制与数组+实战进阶)(二)
【运维知识高级篇】34道Shell编程练习题及答案(从基础到实战:基础+计算+判断+循环+控制与数组+实战进阶)(二)
917 0
|
运维 Shell Linux
【运维知识高级篇】34道Shell编程练习题及答案(从基础到实战:基础+计算+判断+循环+控制与数组+实战进阶)(一)
【运维知识高级篇】34道Shell编程练习题及答案(从基础到实战:基础+计算+判断+循环+控制与数组+实战进阶)
677 0
|
Shell
如何写一个类似于ls的命令?(shell进阶)
如何写一个类似于ls的命令?(shell进阶)
96 0