当前位置: 首页 > news >正文

【Linux】信号处理

一、Linux系统信号

1、常见的系统信号

常见的Linux系统信号
信号描述
1SIGHUP挂起(hang up)进程
2SIGINT中断进(interrupt)程
3SIGQUIT停止(stop)进程
9SIGKILL无条件终止(terminate)进程
15SIGTERM尽可能终止进程
18SIGCONT继续运行停止的进程
19SIGSTOP无条件停止,但不终止进程
20SIGTSTP停止或暂停(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 查看作业的进程号。

 

jobs命令选项
-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 :车联网时序数据库如何高效接入

现代新能源汽车,作为一种内部系统极为复杂的交通工具,配备了大量传感器、导航设备、应用软件,这些传感器产生的数据都需要上报到车联网平台当中。对于这些车辆的状态数据(如车速、发动机转速等)、位置数据(…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来&#xf…...

MMaDA: Multimodal Large Diffusion Language Models

CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

【Oracle】分区表

个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

push [特殊字符] present

push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...

android RelativeLayout布局

<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...

MySQL 主从同步异常处理

阅读原文&#xff1a;https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主&#xff0c;遇到的这个错误&#xff1a; Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一&#xff0c;通常表示&#xff…...