【Linux】信号处理
一、Linux系统信号
1、常见的系统信号
| 信号 | 值 | 描述 |
| 1 | SIGHUP | 挂起(hang up)进程 |
| 2 | SIGINT | 中断进(interrupt)程 |
| 3 | SIGQUIT | 停止(stop)进程 |
| 9 | SIGKILL | 无条件终止(terminate)进程 |
| 15 | SIGTERM | 尽可能终止进程 |
| 18 | SIGCONT | 继续运行停止的进程 |
| 19 | SIGSTOP | 无条件停止,但不终止进程 |
| 20 | SIGTSTP | 停止或暂停(pause),但不终止进程 |
2、两种基本的信号
中断进程Ctrl+C
Ctrl+C生成的是SIGINT信号,它会将其发送给当前在shell中运行的所有进程。
暂停进程Ctrl+Z
Ctrl+Z生成的是SIGTSTP信号,停止shell中运行的任何进程。
停止(stopping)进程和终止(terminating)进程不同,前者是让程序继续驻留在内存中,但依然能从上次停止的位置继续运行。

方括号里的数字 1 是shell分配的作业号。
shell将运行的各个进程称为作业,并且为作业在当前shell内分配了唯一的作业号。作业号从1开始,接着是2,依次递增。
如果shell会话中存在一个已经停止的作业,那么在退出shell时,bash会给出提醒。

此时只需要再输入一遍exit命令即可,shell就会退出,并终止已停止的作业。

也可以用kill命令发送SIGKILL(9)信号将其终止。

ps命令查看已停止的作业。

3、捕获信号trap命令
trap命令可以让shell脚本需要侦测并拦截的Linux信号,如果脚本收到了trap命令中列出的信号,则该信号不再由shell处理,而是由本地处理。
格式:
trap commands signals
commands:列出想要shell执行的命令;
signals:列出想要捕获的信号(多个信号之间用空格分隔)。指定信号时可用信号的值或信号名。
#!/bin/bashtrap "echo '捕获到了Ctrl+C信号'" SIGINTecho "测试脚本"count=1
while [ $count -le 5 ]
doecho "这是第$count次循环"sleep 1count=$[ $count + 1 ]
doneecho "测试脚本结束!"
exit
此shell脚本每次侦测到Ctrl+C信号(SIGINT)时,trap命令都会打印出一条“捕获”信息。通过此,可以阻止用户通过Ctrl+C停止脚本。

如果shell脚本中的命令被信号中断,使用带有指定命令的trap未必能让被中断的命令继续执行。为了保证脚本中的关键操作不被打断,可以使用带有空操作命令的trap以及要捕获的信号列表。
如:trap " " SIGINT
此形式的trap命令可以让shell脚本完全忽略SIGINT信号,继续执行重要工作。

捕获shell脚本在退出时的信号
在trap命令后加上EXIT信号即可。
#!/bin/bashtrap "echo '此脚本已执行完,马上退出……'" EXITecho "测试脚本"count=1
while [ $count -le 5 ]
doecho "这是第$count次循环"sleep 1count=$[ $count + 1 ]
doneecho "测试脚本结束!"
exit
正常退出

提前退出

修改或移除信号捕获
要想在shell脚本中不同位置进行不同的信号捕获处理,只需要重新使用带有新选项的trap命令即可。
#!/bin/bashtrap "echo '捕获到Ctrl+C信号'" SIGINTecho "第1项测试"count=1
while [ $count -le 5 ]
doecho "这是第$count次循环"sleep 1count=$[ $count + 1 ]
donetrap "echo '捕获到Ctrl+Z信号'" 20echo "第2项测试"count=1
while [ $count -le 4 ]
doecho "这是第$count次循环"sleep 1count=$[ $count + 1 ]
doneexit

查看被捕获的信号
在交互式shell会话中使用 trap -p 查看被捕获的信号。如果什么都没显示,说明shell会话按照默认方式处理了信号。

移除已设置好的信号捕获
在trap命令与希望恢复默认行为的信号列表之间加上两个连字符,如 trap -- SIGINT;也可以在trap命令后使用单连字符来恢复信号的默认行为,如 trap - SIGINT
#!/bin/bashtrap "echo '捕获到Ctrl+C信号'" SIGINTecho "第1项测试"count=1
while [ $count -le 5 ]
doecho "这是第$count次循环"sleep 1count=$[ $count + 1 ]
donetrap -- SIGINT # 等同于trap - SIGINT
echo "移除信号捕获。"echo "第2项测试"count=1
while [ $count -le 4 ]
doecho "这是第$count次循环"sleep 1count=$[ $count + 1 ]
doneexit
在移除信号捕获后,一旦执行Ctrl+C,就会立即停止执行脚本。

二、后台运行脚本
使用 ps -e 命令,查看系统后台运行的进程。
在后台运行模式中,进程运行时不和终端会话的STDIN、STDOUT、STDERR关联。

1、后台运行脚本
在脚本名后面加上 & 即可,它会将脚本与当前shell分离开,并将脚本作为一个独立的后台进程运行。
方括号里的数字 1 是shell分配给后台进程的作业号,数字 109747 是Linux系统为进程分配的进程ID(PID)。Linux系统中的每个进程都必须有唯一的PID。
注:如下所示,当后台进程运行时,它仍然会使用终端显示器来显示STDOUT和STDERR的消息。

如下所示,后台运行时可以执行其它命令

三、在非控制台下运行脚本
退出终端会话后,仍然想让脚本一直在后台运行直到结束。可以使用 nohup 命令实现。
nohup命令可以阻断发给特定进程的SIGHUP信号,当退出终端会话时,便可以避免进程退出。
格式:nohup command
当使用nohup命令时,如果关闭终端会话,shell脚本会忽略其发送的SIGHUP信号。由于nohup命令会解除终端与进程之间的关联,因此进程不再同STDOUT和STDERR绑定在一起。为了保存该命令产生的输出,nohup命令会自动将STDOUT和STDERR产生的消息重定向到 nohup.out 的文件中。(nohup.out文件一般在当前工作目录下,不然就在$HOME目录下)

如果使用nohup运行了另一个命令,则该命令的输出会被追加到已有的nohup.out文件中。
四、作业控制
kill命令可以杀死作业,如果要重启已停止的进程,需要向其发送SIGCONT信号。
作业控制包括启动、停止、杀死及恢复。
1、查看作业jobs命令
jobs 命令允许用户查看shell当前正在处理的作业。
#!/bin/bashecho "脚本的PID:$$" # $$是一个特殊变量,它表示shell进程的进程ID(PID)count=1
while [ $count -le 6 ]
doecho "这是第$count次循环。"sleep 8count=$[ $count + 1 ]
doneecho "脚本结束……"
exit
运行脚本后,使用 Ctrl+Z 组合键停止脚本。

然后在后台又运行一次此脚本,并将输出重定向到文件 test1.out 中。
使用 jobs 命令查看分配给shell的作业。
如下图所示,加号 + 表示默认作业。如果作业控制命令没有指定作业号,则引用该默认作业。
减号 - 表示在默认作业结束后成为下一个默认作业。
任何时候,不管shell中运行着多少作业,带加号和减号的作业都有且只能有一个。

jobs -l 查看作业的进程号。

| -l | 列出进程的PID以及作业号 |
| -n | 只列出上次shell发出通知后状态发生改变的作业 |
| -p | 只列出作业的PID |
| -r | 只列出运行中的作业 |
| -s | 只列出已停止的作业 |
删除已停止的作业

2、重启已停止的作业bg命令
可以将已停止的作业作为后台进程或前台进程重启(注:前台进程重启后会接管当前正在使用的终端)
后台模式重启:bg命令
注:当作业被转入后台模式后,并不会显示其PID。
如果存在多个作业,需要在bg命令后加上作业号,如 bg 2

前台模式重启:fg命令
如下所示,因为作业是在前台运行的,所以直到该作业完成后,命令行界面的提示符才会出现。

相关文章:
【Linux】信号处理
一、Linux系统信号 1、常见的系统信号 常见的Linux系统信号 信号值描述1SIGHUP挂起(hang up)进程2SIGINT中断进(interrupt)程3SIGQUIT停止(stop)进程9SIGKILL无条件终止(terminate)…...
5个不同类型的mysql数据库安装
各种社区版本下载官方地址:MySQL :: MySQL Community Downloads 一、在线YUM仓库(Linux) 选择 MySQL Yum Repository 选择对应版本下载仓库安装包(No thanks, just start my download.) 下载方法1:下载到本…...
python学习笔记—12—布尔类型、if语句
1. 布尔类型 (1) 定义 (2) 比较运算符 (3) 代码演示 1. 手动定义 bool_1 True bool_2 False print(f"bool_1的内容是:{bool_1}, 类型是:{type(bool_1)}") print(f"bool_2的内容是:{bool_2}, 类型是:{type(bool…...
分数阶傅里叶变换代码 MATLAB实现
function Faf myfrft(f, a) %分数阶傅里叶变换函数 %输入参数: %f:原始信号 %a:阶数 %输出结果: %原始信号的a阶傅里叶变换N length(f);%总采样点数 shft rem((0:N-1)fix(N/2),N)1;%此项等同于fftshift(1:N),起到翻…...
《数据结构》期末考试测试题【中】
《数据结构》期末考试测试题【中】 21.循环队列队空的判断条件为?22. 单链表的存储密度比1?23.单链表的那些操作的效率受链表长度的影响?24.顺序表中某元素的地址为?25.m叉树第K层的结点数为?26. 在双向循环链表某节点…...
openwrt 清缓存命令行
一、查看缓存 : free -m 二、清缓存:echo 3 > /proc/sys/vm/drop_caches 三、详解。 释放物理页缓存 echo 1 > /proc/sys/vm/drop_caches 释放可回收的slab对象,包含inode and dentry echo 2 > /proc/sys/vm/drop_caches 同时…...
RP2K:一个面向细粒度图像的大规模零售商品数据集
这是一种用于细粒度图像分类的新的大规模零售产品数据集。与以往专注于相对较少产品的数据集不同,我们收集了2000多种不同零售产品的35万张图像,这些图像直接在真实的零售商店的货架上拍摄。我们的数据集旨在推进零售对象识别的研究,该研究具…...
.NET Core FluentAPI
目录 约定配置 主要规则 两种配置方式 Data Annotation Fluent API Fluent API配置 Fluent API众多方法 选择 约定配置 主要规则 表名采用DbContext中的对应的DbSet的属性名。数据表列的名字采用实体类属性的名字,列的数据类型采用和实体类属性类型最兼容…...
【C++数据结构——查找】顺序查找(头歌实践教学平台习题)【合集】
目录😋 任务描述 相关知识 一、根据输入数据建立顺序表 二、顺序表的输出 三、顺序查找算法 测试说明 通关代码 测试结果 任务描述 本关任务:实现顺序查找的算法 相关知识 为了完成本关任务,你需要掌握: 根据输入数据建立…...
HTTP Scheme 通常指的是在 URL 中用于指定使用 HTTP 协议的方案(scheme)
HTTP Scheme 通常指的是在 URL 中用于指定使用 HTTP 协议的方案(scheme)。URL(统一资源定位符)中的 scheme 部分指明了访问资源所使用的协议。对于 HTTP,有两个主要的 scheme: - **http**:表示…...
基于Matlab的变压器仿真模型建模方法(13):单相升压自耦变压器的等效电路和仿真模型
1.单相升压自耦变压器的基本方程和等效电路 单相升压自耦变压器的接线原理图如图1所示。在建立自耦变压器的基本方程时,仍然把它看成是从双绕组变压器演变而来。在图1中,设节点a到节点b部分的绕组的匝数为,对应于双绕组变压器的原边绕组;节点c到节点a部分的绕组的绕组匝数为…...
【Vue.js】监听器功能(EventListener)的实际应用【合集】
目录 🤔在实际开发过程中,我遇到了一个颇为棘手的小问题 😋解决这个小问题 问题出现的原因剖析 解决方法阐述 问题成功解决! 📖相关知识总结 基本概念 使用方法 实际应用场景 🤔在实际开发过程中…...
【Shell脚本】Docker构建Java项目,并自动停止原镜像容器,发布新版本
本文简述 经常使用docker部署SpringBoot 项目,因为自己的服务器小且项目简单,因此没有使用自动化部署。每次将jar包传到服务器后,需要手动构建,然后停止原有容器,并使用新的镜像启动,介于AI时代越来越懒的…...
【iOS Swift Moya 最新请求网络框架封装通用】
【iOS Swift Moya 最新请求网络框架封装通用】 前言框架结构1.API定义(TargetType)2. 配置MoyaProvider3. 网络管理器4. 使用示例注意事项进一步优化 前言 设计一个基于Moya的网络请求框架,可以提供灵活的网络请求管理,例如设置请…...
前端批量下载文件
背景 文件管理页面,后端只提供了一个根据 file_path 和 file_name 参数下载文件的API接口。产品需要支持用户多选之后的批量下载功能。 技术实现 基础代码 先调用下载接口,获取到二进制的文件流,然后通过 a 标签完成下载。 // return [r…...
【pytorch-lightning】架构一览
pytorch-lightning是基于pytorch的一个套壳项目,适配pytorch的版本同步更新速度很快。 它将训练的几个主要流程模块化,减少重复工作,同时让支持分布式训练,不同平台的训练迁移变得更加简单。 官网链接...
MongoDB相关使用问题
1.【报错】sort operation used more than the maximum 33554432 bytes of RAM. Add an index MongoDB 排序超过内存限制,限制最大为100M。 解决方式:将内存排序改为磁盘排序 正常用法:数据量大了再排序会报错 Autowired protected MongoO…...
DevSecOps自动化在安全关键型软件开发中的实践、Helix QAC Klocwork等SAST工具应用
DevSecOps自动化对于安全关键型软件开发至关重要。 那么,什么是DevSecOps自动化?具有哪些优势?为何助力安全关键型软件开发?让我们一起来深入了解~ 什么是DevSecOps自动化? DevSecOps自动化是指在软件开发生命周期的各…...
常见的显示器分辨率及其对应的像素数量
显示器的像素数量通常由其分辨率决定,分辨率表示为水平像素数乘以垂直像素数。 720P(1280720): 像素数量:约92.16万特点:这是高清标准的一个分辨率,通常用于手机、平板电脑或小型显示器。900P&…...
TDengine + MQTT :车联网时序数据库如何高效接入
现代新能源汽车,作为一种内部系统极为复杂的交通工具,配备了大量传感器、导航设备、应用软件,这些传感器产生的数据都需要上报到车联网平台当中。对于这些车辆的状态数据(如车速、发动机转速等)、位置数据(…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
