Shell:控制脚本 - 信号量

news2024/11/16 2:39:54

1. 处理信号

1.1 重温Linux信号

Linux系统和应用程序可以生成超过30个信号。表16-1列出了在Linux编程时会遇到的最常见
的Linux系统信号。
在这里插入图片描述
在这里插入图片描述
通过SIGINT信号,可以中断shell。

你可能也注意到了,shell会将这些信号传给shell脚本程序来处理。而shell脚本的默认行为 是忽略这些信号。它们可能会不利于脚本的运行。要避免这种情况,你可以脚本中加入识别信
号的代码,并执行命令来处理信号。

1.2 生成信号

中断进程

Ctrl+C组合键会生成SIGINT信号

$ sleep 100 ^C
$
暂停进程

Ctrl+Z组合键会生成一个SIGTSTP信号,停止shell中运行的任何进程。停止(stopping)进程跟终止(terminating)进程不同:停止进程会让程序继续保留在内存中,并能从上次停止的位置继续运行

当用Ctrl+Z组合键时,shell会通知你进程已经被停止了。

$ sleep 100 ^Z
[1]+ Stopped 		sleep 100
$

方括号中的数字是shell分配的作业号(job number)。shell将shell中运行的每个进程称为作业, 并为每个作业分配唯一的作业号。它会给第一个作业分配作业号1,第二个作业号2,以此类推。

可以用ps命令来查看已停止的作业。

$ sleep 100 ^Z
[1]+ Stopped $
sleep 100
$ ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 501 2431 2430 0 80 0 - 27118 wait pts/0 00:00:00 bash 
0 T 501 2456 2431 0 80 0 - 25227 signal pts/0 00:00:00 sleep 
0 R 501 2458 2431 0 80 0 - 27034 - pts/0 00:00:00 ps
$

S列中(进程状态),ps命令将已停止作业的状态为显示为T。这说明命令要么被跟踪,要 么被停止了。

如果在有已停止作业存在的情况下,你仍旧想退出shell,只要再输入一遍exit命令就行了。 shell会退出,终止已停止作业。或者,既然你已经知道了已停止作业的PID,就可以用kill命令 来发送一个SIGKILL信号来终止它。

$ kill -9 2456 $
[1]+ Killed			sleep 100
$
捕获信号

trap命令允许你来指定shell 脚本要监看并从shell中拦截的Linux信号。如果脚本收到了trap命令中列出的信号,该信号不再 由shell处理,而是交由本地处理。

trap命令的格式是:

trap commands signals

这里有个简单例子,展示了如何使用trap命令来忽略SIGINT信号,并控制脚本的行为。

$ cat test1.sh
#!/bin/bash
# Testing signal trapping
#
trap "echo ' Sorry! I have trapped Ctrl-C'" SIGINT #
echo This is a test script
#
count=1
while [ $count -le 10 ]
do
       echo "Loop #$count"
       sleep 1
       count=$[ $count + 1 ]
done
#
echo "This is the end of the test script"
#

捕获这些 信号会阻止用户用bash shell组合键Ctrl+C来停止程序。每次使用Ctrl+C组合键,脚本都会执行trap命令中指定的echo语句,而不是处理该信号并允许shell停止该脚本。

$ ./test1.sh
This is a test script
Loop #1
Loop #2
Loop #3
Loop #4
Loop #5
^C Sorry! I have trapped Ctrl-C Loop #6
Loop #7
Loop #8
^C Sorry! I have trapped Ctrl-C Loop #9
Loop #10
This is the end of the test script $

2. 在非控制台下运行脚本

有时你会想在终端会话中启动shell脚本,然后让脚本一直以后台模式运行到结束,即使你退 出了终端会话。这可以用nohup命令来实现。

nohup命令运行了另外一个命令来阻断所有发送给该进程的SIGHUP信号。这会在退出终端会话时阻止进程退出。

nohup命令的格式如下:

$ nohup ./test1.sh &
[1] 3856
$ nohup: ignoring input and appending output to 'nohup.out'
$

由于nohup命令会解除终端与进程的关联,进程也就不再同STDOUT和STDERR联系在一起。为了保存该命令产生的输出,nohup命令会自动将STDOUT和STDERR的消息重定向到一个名为 nohup.out的文件中。

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

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

相关文章

图像增强技术简介

目录 一、概论 二、图像噪声 三、图像增强处理分类 一、概论 图像增强作为基本的图像处理技术,其目的是对图像进行加工,以得到对具体应用来说视觉效果更“好”更“有用”的图像。图像增强算法并不能增加原始图像的信息,而是通过某种技术手…

基础数据结构 -- 图

1 简介 图是一种用 节点 和 边 来表示相互关系的数学模型,其中节点代表事物,边代表事物间的联系。图作为一种数据结构,在各种领域都有广泛应用,如社交网络、城市交通网络、互联网页面链接等。 图由两个主要部分构成: 节…

XXX【4】策略模式

如上图所示,如果要加入一个新的货币,那么就需要对类中的Calculate函数进行修改,这违背了封闭开放原则。 上图中的方式更加合适,搞一个抽象类(方法中可以用多态调用),然后每个货币自己是一个类&a…

井盖异动传感器:为城市安全加码

城市的地下管网错综复杂,井盖作为连接地面与地下的重要通道,其安全性至关重要。然而,由于各种原因导致的井盖丢失或损坏事件时有发生,给行人和车辆带来了极大的安全隐患。 一、智能科技,守护脚下安全 旭华智能井盖异…

3D可视化项目

3D可视化项目是指利用3D技术和工具来将数据、场景或概念以可视化的方式呈现出来,以便更好地理解和分析。这些项目通常涉及使用3D建模、渲染和动画技术,将数据或概念转化为具有深度和逼真感的可视化场景或对象。3D可视化项目涉及到的技术栈主要包括以下几…

从零开始掌握限流技术:计数器、滑动窗口、漏桶与令牌桶详解

为什么需要限流呢? 🔹想象一下,你的服务器就像一个繁忙的餐馆,而你的应用就像是餐馆的服务员。餐馆里人山人海,每个人都在争先恐后地想要点餐。这时候,如果没有一个好的限流机制,会发生什么呢&…

【轻松拿捏】设计模式六大基本原则(一)单一职责原则(SRP - Single Responsibility Principle)

🎈边走、边悟🎈迟早会好 一. 概述 单一职责原则(SRP - Single Responsibility Principle)是面向对象设计中的一个基本原则。它的核心思想是:一个类只应有一个引起它变化的原因,也就是说,一个类…

使用Docker-compose一键部署Wordpress平台

一、Docker-compose概述: docker-compose:单机容器编排 Dockerfile:先配置好文件,然后build,镜像——>容器。 docker-compose:即可基于Dockerfile,也可以基于镜像,可以一键式拉…

扎心“我学了六个月 Python,怎么还是会找不到工作”

前言 👉 小编已经为大家准备好了完整的代码和完整的Python学习资料,朋友们如果需要可以扫描下方CSDN官方认证二维码或者点击链接免费领取【保证100%免费】 在编程界,Python是一种神奇的存在。有人认为,只有用Python才能优雅写代码…

qt-16可扩展对话框--隐藏和展现

可扩展对话框 知识点extension.hextension.cppmain.cpp运行图初始化隐藏展现--点击--详细按钮 知识点 MainLayout->setSizeConstraint(QLayout::SetFixedSize);//固定窗口大小 extension.h #ifndef EXTENSION_H #define EXTENSION_H#include <QDialog>class Extens…

如何对 GitLab 中文版进行升级?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门面向中国程序员和企业提供企业级一体化 DevOps 平台&#xff0c;用来帮助用户实现需求管理、源代码托管、CI/CD、安全合规&#xff0c;而且所有的操作都是在一个平台上进行&#xff0c;省事省心省钱。可以一键安装极狐GitL…

EVE-NG导入锐捷镜像

安装搭建好了EVE-NG之后&#xff0c;我们想要做虚拟实验还需要载入虚拟镜像&#xff0c;下面我来演示如何导入锐捷镜像 准备工作&#xff1a; 1.安装EVE-NG 2.FTP远程传输工具 正式开始&#xff1a; 第一步&#xff1a;下载镜像 前往锐捷官网下载锐捷设备镜像 锐捷镜像下…

以太网链路聚合(LACP模式)

1. 实验目的 掌握使用静态LACP模式配置链路聚合的方法掌握控制静态LACP模式下控制活动链路的方法掌握静态LACP的部分特性的配置 实验拓扑 实验拓扑如图11-12所示&#xff1a; 图11-12以太网聚合LACP模式 3. 实验步骤 PC机IP地址的配置 PC1的配置&#xff0c;在ipv4下选…

内存(动态开辟)———C语言

内存管理&#xff1a; 1.C语言运行时的内存分配 2.static关键字 1.修饰变量 局部变量&#xff1a; <1>在编译的过程中&#xff0c;会在数据区为该变量开辟空间&#xff0c;如果代码中未对其进行初始化&#xff0c;则系统默认初始化为0。 <2>用static修饰的局部变量…

a股市场的股票怎么做期权交易

在金融市场中&#xff0c;A股股票期权是一种重要的衍生金融工具&#xff0c;它赋予持有者在未来某一特定日期以预定价格买入或卖出股票的权利。了解期权交易流程对于投资者至关重要&#xff0c;本文将详细介绍a股市场的股票怎么做期权交易&#xff1f;本文来自&#xff1a;期权…

【软件测试】测试阶段、评审、瀑布式流程

软件测试 测试阶段评审瀑布式流程 测试阶段 冒烟测试&#xff08;Smoke Testing&#xff09;&#xff1a; 冒烟测试是一种快速的初步测试&#xff0c;通常在开发周期的早期进行&#xff0c;用以验证软件的基本功能是否按预期工作。它通常在软件构建完成后立即执行&#xff0c;以…

【windows系统】应用与功能下卸载程序提示Windows找不到文件解决办法

我们使用windows系统的时候&#xff0c;想要删除某个程序&#xff0c;可以通过windows系统设置中的添加或删除程序来操作&#xff0c;如下图所示 打开如图下所示应用和功能界面&#xff0c;可以对程序进行卸载 如图下所示&#xff0c;我们可以通过这种方式卸载掉电脑中的程序 但…

ClickHouse集群的安装

目录 1.clickhouse中文文档地址 2.centos安装部署 2.1采用tgz的方式安装 2.2修改配置文件 2.3修改数据目录 2.4创建角色和目录 3 集群安装 3.1配置文件修改 3.2启动zookeeper 3.3启动clickhouse-server 3.4任意节点连接clickhouse 3.5查看集群 3.6建库 3.7查看数…

【Linux 驱动】IMX6ULL pinctrl驱动

1. 概述 Linux 驱动讲究驱动分离与分层&#xff0c;pinctrl 和 gpio 子系统就是驱动分离与分层思想下的产物。pinctrl顾名思义就是引脚控制&#xff0c;用来配置比如引脚mux复用信息&#xff0c;引脚电器属性&#xff08;比如上/下拉、速度、驱动能力等&#xff09;信息。gpio顾…

学会区分大模型——大模型的分类,让你更清晰的认识大模型

乱花渐欲迷人眼&#xff0c;学会从根本上认识问题 现在市面上大模型如百花齐放&#xff0c;对很多人来说一堆大模型带来的不是简单方便&#xff0c;而是乱七八糟以及迷茫。 因为不知道不同的大模型之间有什么区别&#xff0c;也不知道自己需要什么样的大模型&#xff1b;就拿…