【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 :车联网时序数据库如何高效接入
现代新能源汽车,作为一种内部系统极为复杂的交通工具,配备了大量传感器、导航设备、应用软件,这些传感器产生的数据都需要上报到车联网平台当中。对于这些车辆的状态数据(如车速、发动机转速等)、位置数据(…...
daz3d + PBRSkin (MDL)+ SSS
好的,我们来解释一下 Daz3D 中的 PBRSkin (MDL) Shader。 简单来说,PBRSkin (MDL) 是 Daz Studio 中一种基于物理渲染(PBR)技术、专门用于创建高度逼真人物皮肤效果的着色器(Shader)。 它利用 NVIDIA 的材…...

FastAPI安全异常处理:从401到422的奇妙冒险
title: FastAPI安全异常处理:从401到422的奇妙冒险 date: 2025/06/05 21:06:31 updated: 2025/06/05 21:06:31 author: cmdragon excerpt: FastAPI安全异常处理核心原理与实践包括认证失败的标准HTTP响应规范、令牌异常的特殊场景处理以及完整示例代码。HTTP状态码选择原则…...

如何查看自己电脑安装的Java——JDK
开始->运行->然后输入cmd进入dos界面 (快捷键windows->输入cmd) 输入java -version,回车 出现了一下信息就是安装了jdk 输入java -verbose,回车 查看安装目录...
基于Flask框架的前后端分离项目开发流程是怎样的?
基于Flask框架的前后端分离项目开发流程可分为需求分析、架构设计、并行开发、集成测试和部署上线五个阶段。以下是详细步骤和技术要点: 一、需求分析与规划 1. 明确项目边界 功能范围:确定核心功能(如用户认证、数据管理、支付流程&#…...
类型别名与类型自动推导
类型别名与类型的自动推导 类型别名 为什么要引入类型别名? 为了给类型赋予特殊含义或便于使用 典型用途 (1)增强代码可移植性 例如:size_t (在不同系统中可能是unsigned int 或 unsigned long) 首先是…...

网络寻路--图论
所以我们固定题中M条边(因为这M条一定联通) P8605 [蓝桥杯 2013 国 AC] 网络寻路 - 洛谷 #include<bits/stdc.h> using namespace std; #define N 100011 typedef long long ll; typedef pair<int,int> pii; int n,m; int d[N],u[N],v[N]…...
【强化学习】——03 Model-Free RL之基于价值的强化学习
【强化学习】——03 Model-Free RL之基于价值的强化学习 \quad\quad \quad\quad 动态规划算法是基于模型的算法,要求已知状态转移概率和奖励函数。但很多实际问题中环境 可能是未知的,这就需要不基于模型(Model-Free)的RL方法。 \quad\quad 其又分为: 基于价值(Valu…...
九.C++ 对引用的学习
一.基本概念 引用即内存的别名 int a 10; int& b a; 引用本身不占用内存,并非实体,对引用的所有操作都是在对目标内存进行操作 引用必须初始化,且不能更换对象 int c 5; b c; // 仅仅是在对引用的目标内存进行赋值 #include <ios…...
Go 为何天生适合云原生?
当前我们正处在 AI 时代,但是在基础架构领域,仍然处在云原生时代。云原生仍然是当前时代的风口之一。作为一个 Go 开发者,职业进阶的下一站就是学习云原生技术。作为 Go 开发者学习云原生技术有得天独厚的优势,这是因为 Go 天生适…...

AIGC赋能前端开发
一、引言:AIGC对前端开发的影响 1. AIGC与前端开发的关系 从“写代码”到“生成代码”传统开发痛点:重复性编码工作、UI 设计稿还原、问题定位与调试...核心场景的AI化:需求转代码(P2C)、设计稿转代码(D2…...