【shell】为shell布置陷阱:trap捕捉信号

trapShell编程中的一种强大内置命令,‌用于捕获和处理信号。‌

信号是操作系统用于与正在运行的程序进行通信的机制。‌当发生某些特定事件时,‌操作系统会发送信号给程序,‌例如用户按下Ctrl+C终止程序的运行。‌trap命令允许我们在Shell脚本中捕获这些信号,‌并在发生时执行指定的操作。‌这种机制对于处理脚本中断、‌资源清理等场景非常有用。‌

trap命令的使用语法和常见应用场景如下:‌

清理资源:‌在脚本执行结束时,‌可以使用trap命令来执行清理操作,‌如关闭文件描述符、‌删除临时文件等。‌
记录错误日志:‌当脚本执行过程中发生错误时,‌trap命令可以用来将错误信息记录到日志文件中。‌
忽略特定信号:‌例如,‌可以忽略Ctrl+C信号,‌防止脚本被意外中断。‌
优雅地处理脚本终止:‌在脚本执行过程中模拟异常终止的情况,‌trap命令可以用来执行一些优雅的关闭操作,‌如清理资源、‌关闭数据库连接等。‌
trap命令的参数分为两部分:‌前一部分是接收到指定信号时将要采取的行动,‌后一部分是要处理的信号名。‌trap命令有三种形式分别对应三种不同的信号回应方式:‌

当脚本收到signal-list清单内列出的信号时,‌trap命令执行双引号中的命令。‌
trap不指定任何命令,‌接受信号的默认操作,‌默认操作是结束进程的运行。‌
trap指定一个空命令串,‌允许忽视信号,‌这在需要忽略某些信号时非常有用。‌
需要注意的是,‌脚本程序通常是以从上到下的顺序解释执行的,‌所以必须在你想保护的那部分代码以前指定trap命令。

主要用法及代码示例
以下是 trap 命令的十种主要用法及其代码示例:

用法示例代码
捕获并处理指定信号trap ‘echo “Signal received.”’ INT
忽略指定信号trap ‘’ TERM
恢复默认的信号处理方式trap - INT
设置 EXIT 信号处理函数trap ‘cleanup’ EXIT
在函数内部设置 RETURN 信号处理函数func() { trap ‘cleanup’ RETURN; … }
清除所有已设置的信号处理函数trap - INT TERM EXIT
执行命令并在结束时恢复先前的信号处理方式trap ‘cmd’ EXIT; cmd
在循环中使用 trap 避免在接收到信号时终止循环while true; do trap ‘break’ INT; … ; done
使用函数作为信号处理函数trap ‘cleanup’ INT; cleanup() { echo “Cleaning up…”; }
处理多个信号trap ‘echo “Signal 1 received.”’ SIGUSR1; trap ‘echo “Signal 2 received.”’ SIGUSR2

以下是一些使用 trap 命令的最佳实践示例:

  1. 清理资源:
#!/bin/bashcleanup() {echo "Cleaning up..."# 执行清理操作,例如关闭文件描述符、删除临时文件等
}
# 设置 EXIT 信号处理函数
trap cleanup EXIT
# 其他代码逻辑
  1. 记录错误日志:
#!/bin/bashlog_file="error.log"# 定义错误处理函数,将错误信息记录到日志文件
handle_error() {echo "$(date): $BASH_COMMAND failed with exit code $?" >> "$log_file"exit 1
}# 设置 ERR 信号处理函数
trap handle_error ERR# 其他代码逻辑
  1. 忽略特定信号:
#!/bin/bash# 忽略 CTRL+C 信号
trap '' INT# 其他代码逻辑
  1. 优雅地处理脚本终止:
#!/bin/bashcleanup() {echo "Performing cleanup..."# 清理操作
}# 设置 EXIT 信号处理函数
trap cleanup EXIT# 主要代码逻辑
echo "Running script..."# 模拟脚本执行过程中的异常终止
if [[ "$1" == "error" ]]; thenecho "Error occurred."exit 1
fiecho "Script completed successfully."

这些示例演示了如何使用 trap 命令来处理不同的情况。根据具体需求,您可以根据自己的脚本逻辑和异常处理要求进行相应的定制。

  1. 其他类似命令
    除了 trap 命令,还有其他一些类似的接口可用于异常处理和信号捕获,如下所示:
  • kill: 用于向进程发送信号,可以用来模拟信号的发出。
  • psignal: 用于将信号名称转换为对应的描述字符串。
  • sigaction: 在更高级别上设置信号处理方式。
  1. 详细区别
    trap 命令与其他类似的接口相比具有以下区别:
  • trap 可以在 shell 脚本中定义信号处理函数,而 kill 和 psignal 主要用于发送和显示信号。
  • trap 可以在脚本中捕获和处理多种信号,而 sigaction 则提供更复杂的信号处理功能。
  • trap 可以捕获并处理特定事件(如 EXIT),而其他接口主要用于操作信号。
  1. 其他示例
#!/usr/bin/env bashset -enotes () {cat << EOF
======== WARM TIPS ========
Before you submit any github issue, please do the following check:
* make sure xxx
* make sure xxx
* check your internet connection if timeout happens
* check for potential port conflicts if you have local services
===========================
EOF
}trap notes ERR
#!/bin/bash# 函数定义:当脚本接收到信号时执行
trap_handler() {echo "脚本接收到信号,正在清理并退出..."# 在此处添加其他清理工作exit 0
}# 设置trap
trap 'trap_handler' SIGINT SIGTERM# 模拟长时间运行的进程
echo "按Ctrl+C或者使用kill命令发送SIGTERM信号试试看..."
while true; dosleep 1
done

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/873639.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++:模板类的继承

模板类的继承 1)类模板 继承 类模板 (2)类模板 继承 模板类 (3)类模板 继承 普通类 (4)普通类 继承 模板类 单模板参数&#xff0c;类模板继承类模板&#xff0c;代码实现 //作为父类 template <typename T> class People {private:/* data */int age;public:T x;Peopl…

【思科】链路聚合实验配置和背景

【思科】链路聚合实验配置和背景 背景链路聚合基本概念链路聚合聚合接口 思科链路聚合协议01.PAgP协议02.LACP协议 思科链路聚合模式LACP协议模式PAgP协议模式ON模式 实验准备配置二层链路聚合LACP协议模式SW1SW2PC1PC2查看LACP聚合组建立情况查看LACP聚合端口情况查看逻辑聚合…

「实战应用」如何用DHTMLX将上下文菜单集成到JavaScript甘特图中(三)

DHTMLX Gantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的所有需求&#xff0c;是最完善的甘特图图表库。 DHTMLX Gantt是一个高度可定制的工具&#xff0c;可以与项目管理应用程序所需的其他功能相补充。在本文中您将学习如何使用自定义上…

设计模式——模版方法和策略模式

前言 作为一名资深CV工程师&#xff0c;学会为自己减少工作量乃重中之重。但只是一味地CV&#xff0c;只会因为劣质代码而让自己的工作量加倍&#xff0c;为了将来不被繁重的维护工作而打扰自己的休息日&#xff0c;为了更好的节能&#xff0c;学习设计模式&#xff0c;刻不容缓…

数据结构_Map和Set

目录 一、搜索模型 二、Map 2.1 Map.Entry 2.2 Map 方法 2.3 Map 注意事项 三、Set 3.1 Set 方法 3.2 Set 注意事项 四、哈希表 4.1 哈希表 4.2 冲突 4.3 哈希函数设计 4.4 闭散列 4.5 开散列/哈希桶 总结 【搜索树】 二叉搜索树又称二叉排序树&#xff0c;它或…

spring-boot 整合 redisson 实现延时队列(文末有彩蛋)

应用场景 通常在一些需要经历一段时间或者到达某个指定时间节点才会执行的功能&#xff0c;比如以下这些场景&#xff1a; 订单超时提醒收货自动确认会议提醒代办事项提醒 为什么使用延时队列 对于数据量小且实时性要求不高的需求来说&#xff0c;最简单的方法就是定时扫描数据…

使用Pandas读取Excel文件将特定列转成str格式方法汇总

文章目录 读取Excel文件并确保列为字符串类型使用 dtype 参数使用 converters 参数 读取Excel文件的正确拼写示例&#xff1a;读取Excel文件并过滤包含特定值的行详细解释 读取Excel文件并确保列为字符串类型 正确的方法是使用 pd.read_excel 函数&#xff0c;并指定 dtype 或…

Webserver笔记

代码随想录的项目 LogStream.h // 返回data_ char数组的数据末尾地址 const char* end() const { return data_ sizeof data_; }Logging.cpp //定义一个 struct timeval 类型的变量 tv&#xff0c;用于存储当前的时间信息。 //定义一个 time_t 类型的变量 time&#xff0c;用…

语音合成-TTS文字转语音(专业版)

语音合成-TTS文字转语音(专业版) 一、工具简介 *使用强大的智能AI语音库&#xff0c;合成独具特色接近真人语音的朗读音频。 *使用极具表现力和类似人类的声音&#xff0c;使文本阅读器和已启用语音的助理等方案栩栩如生。 *用途&#xff1a;这个语音工具&#xff0c;不仅可…

【C语言初阶】C语言数组基础:从定义到遍历的全面指南

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C语言 “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;C语言函数 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀数组 &#x1f4d2;1. 什么是数组…

HTTP状态码(HTTP Status Code)讲解

HTTP状态码&#xff08;HTTP Status Code&#xff09;是用以表示网页服务器超文本传输协议响应状态的3位数字代码。它由RFC 2616规范定义&#xff0c;并得到多个RFC规范的扩展。状态码告知客户端请求的处理结果及状态&#xff0c;有助于开发者定位和解决问题。 HTTP状态码分为…

HTTP请求与响应:Python爬虫技术解析

引言 在Web开发和数据抓取中&#xff0c;理解HTTP协议是至关重要的。HTTP&#xff08;超文本传输协议&#xff09;是用于从网络传输超文本到本地浏览器的标准协议。它定义了客户端与服务器之间请求和响应的格式。本文将从HTTP请求和响应的基本结构开始&#xff0c;逐步深入到如…

【C++】学习笔记——AVL树

文章目录 十六、AVL树1. AVL树的概念2. AVL树节点的定义3. AVL树的插入4. AVL树的旋转5. AVL树的验证6. 完整代码测试7. AVL树的性能 未完待续 十六、AVL树 1. AVL树的概念 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支树&…

【机器学习】无监督学习和自监督学习

1. 什么是机器学习 机器学习是一种使计算机系统能够从数据中学习并做出预测或决策的技术和科学领域。它不需要显式地编程来执行特定任务&#xff0c;而是通过使用算法来分析数据和识别模式&#xff0c;以此“学习”如何做出准确的预测或决策。 以下是机器学习的几个关键点&…

【JS逆向课件:第七课:模块与包】

模块与包 模块 模块介绍 在计算机程序的开发过程中&#xff0c;随着程序代码越写越多&#xff0c;在一个文件里代码就会越来越长&#xff0c;越来越不容易维护。 为了编写可维护的代码&#xff0c;我们把很多函数分组&#xff0c;分别放到不同的文件里&#xff0c;这样&…

前端基础之JavaScript学习——函数的使用

大家好我是来自CSDN的前端寄术区博主PleaSure乐事&#xff0c;今天我们继续有关JavaScript的学习&#xff0c;使用的编译器为vscode&#xff0c;浏览器为谷歌浏览器。 函数的声明与使用 声明 在JavaScript当中函数的声明和其他语言类似&#xff0c;使用如下格式即可声明&…

实战篇(十):使用Processing创建可爱花朵:实现随机位置、大小和颜色的花朵

使用Processing创建可爱花朵 0.效果预览1. 引言2. 设置Processing环境3. 创建花朵类4. 实现花瓣绘制5. 绘制可爱的笑脸6. 鼠标点击生成花朵7. 完整代码8. 总结与扩展0.效果预览 在本教程中,我们将使用Processing编程语言来创建一个可爱的花朵生成器。通过封装花朵为一个类,并…

大语言模型-检索测评指标

1. MRR &#xff08;Mean Reciprocal Rank&#xff09;平均倒数排名&#xff1a; 衡量检索结果排序质量的指标。 计算方式&#xff1a; 对于每个查询&#xff0c;计算被正确检索的文档的最高排名的倒数的平均值&#xff0c;再对所有查询的平均值取均值。 意义&#xff1a; 衡量…

Context使用

Context API 是 React 提供的一种用于跨组件层级共享数据的方法&#xff0c;它可以用来实现兄弟组件之间的通信。通常情况下&#xff0c;兄弟组件之间的通信需要通过它们的共同父组件来实现&#xff0c;而 Context API 则可以帮助我们避免将数据逐层传递到每一个中间组件。 实…

京准:GPS北斗卫星授时信号安全隔离防护装置

京准&#xff1a;GPS北斗卫星授时信号安全隔离防护装置 京准&#xff1a;GPS北斗卫星授时信号安全隔离防护装置 1、主要特点 ★信号加固功能&#xff1a; GPS/BDS单系统信号拒止情况下&#xff08;包含受到GPS L1欺骗干扰、GPS L1压制干扰、BDS B1欺骗干扰、BDS B1压制干扰&…