shell脚本控制


shell脚本编程系列


处理信号

Linux利用信号与系统中的进程进行通信,通过对脚本进行编程,使其在收到特定信号时执行某些命令,从而控制shell脚本的操作。

  • Linux信号
    shell脚本编程会遇到的最常见的Linux系统信号如下表所示:
    在这里插入图片描述

在默认情况下,bash shell会忽略收到的任何SIGQUIT(3)信号和SIGTERM(15)信号(因此交互式shell才不会被意外终止)。
bash shell会处理接收到的所有SIGHUP(1)和SIGINT(2)信号。
如果收到SIGHUP信号,比如离开交互式shell时,bash shell就会退出,但是在退出之前,它会将SIGHUP信号传给所有由该shell启动的进程,包括正在运行的脚本。
如果收到SIGINT信号,shell会被中断,Linux内核将不再为shell分配CPU处理时间。当出现这种情况时,shell会将SIGINT信号传给由其启动的所有进程。
shell脚本默认行为时忽略Linux信号,因为不利于脚本运行,要避免这种情况,可以在脚本中加入识别信号的代码,并做相应的处理。

  • 产生信号
    中断进程 CTRL+C组合键会生成SIGINT信号
    在这里插入图片描述

暂停进程 Ctrl+Z组合键会生成SIGTSTP信号,停止shell中运行的任何进程。停止进程和终止进程不同,前者让程序驻留在内存中,还能从上次停止的位置继续运行。
在这里插入图片描述

  • 捕获信号
    trap commands signals
    trap命令可以指定shell脚本需要侦测并拦截的Linux信号。在commands部分列出想要shell执行的命令,在signals部分列出要捕获的信号(多个信号之间以空格分隔),指定信号时,可以使用信号的值或信号名
    #!/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 5 ]
    do
         echo "Loop #$count"
         sleep 1
         count=$[ $count + 1 ]
    done
    #
    echo "This is the end of test script."
    exit
    
    trap "" SIGINT允许脚本完全忽略SIGINT信号,继续执行重要的工作
  • 捕获脚本退出
    除了在shell脚本中捕获信号,也可以在脚本退出是捕获信号,这也是shell完成任务时执行命令的一种简便方法。要捕获脚本退出,只需要在trap命令后加上EXIT信号即可
    #!/bin/bash
    #Testing exit trapping
    #
    trap "echo Goodbye..." EXIT
    #
    count=1
    while [ $count -le 5 ]
    do
         echo "Loop #$count"
         sleep 1
         count=$[ $count + 1 ]
    done
    #
    exit
    
  • 修改或移除信号捕获
    重新使用带有新内容的trap命令可以修改信号捕获
    在trap命令与希望恢复默认行为的信号之间加上两个连字符可以移除设置好的信号捕获
    trap -- SIGINT
    #!/bin/bash
    #Removing a set trap
    #
    trap "echo ' Sorry...Ctrl-C is trapped.'" SIGINT
    #
    count=1
    while [ $count -le 3 ]
    do
         echo "Loop #$count"
         sleep 1
         count=$[ $count + 1 ]
    done
    #
    trap -- SIGINT
    echo "The trap is now removed."
    #
    count=1
    while [ $count -le 3 ]
    do
         echo "Second Loop #$count"
         sleep 1
         count=$[ $count + 1 ]
    done
    #
    exit
    

以后台模式运行脚本

以后台模式执行脚本,只需要在脚本名后面加上&即可,比如 ./backgroundscript.sh &,&符号会将脚本与当前shell分离开来,并将脚本作为一个独立的后台进程运行
在指定之后,会在控制台输出类似于[1] 2595的字样,其中方括号中的1是shell分配给后台进程的作业号,而后面的2595是Linux系统为进程分配的进程ID(PID)。Linux系统中的每个进程都必须有唯一的PID
当后台进程运行时,它仍然会使用终端显示器来显示STDOUT和STDERR信号

#!/bin/bash
#Test running in the background
#
echo "Starting the script..."
count=1
while [ $count -le 5 ]
do
     echo "Loop #$count"
     sleep 1
     count=$[ $count + 1 ]
done
#
echo "Script is completed."
exit

每次启动新作业时,Linux系统都会为其分配新的作业号和PID。在终端会话中使用后台进程一定要小心,每一个后台进程都和终端会话(pts/0)关联在一起,如果终端会话退出,那么后台进程也会随之退出。

在非控制台下运行脚本

nohup命令能阻断发给特定进程的SIGHUP信号,这样当终端会话退出时,就可以避免进程退出,格式为nohup command
由于nohup命令会将进程与终端的关联解除,所以进程不再同STDOUT和STDERR绑定在一起,默认情况下,nohup命令会将二者产生的消息重定向到一个名为nohup.out的文件中
nohup ./testAscript.sh &
在这里插入图片描述

如果使用nohup命令运行了另一个命令,则输出会追加到已有的nohup.out文件中。当运行同一目录中的多个命令时,一定要当心,因为所有的命令输出都会发送到同一个nohup.out文件中

作业控制

作业控制包括启动、停止、杀死和恢复作业
通过jobs命令查看作业
其中-l选项会列出进程的PID以及作业号
-n 只列出上次shell发出通知后状态发生改变的作业
-r 只列出运行中的作业
-s 只列出已停止的作业
在这里插入图片描述

删除已停止的作业,只需要使用kill命令向其pid发送SIGKILL(9)信号即可
要以后台模式重启作业,可以使用bg命令
在这里插入图片描述

如果存在多个作业,则需要在bg命令后加上作业号,以便于控制
在这里插入图片描述

要以前台模式重启作业,可以使用带有作业号的fg命令,比如fg 2

调整谦让度

在多任务操作系统中,内核负责为每个运行的进程分配CPU时间。调度优先级也称为谦让度(nice value),是指内核为进程分配的CPU时间(相对于其他进程)。在Linux系统中,由shell启动的所有进程的调度优先级默认都是相同的
调度优先级是一个整数值,取值范围从-20(最高优先级)到+19(最低优先级)。默认情况下, bash shell以优先级0来启动所有进程
nice命令允许在启动命令时设置调度优先级,通过选项-n指定即可

nice -n 10 ./jobcontrol.sh > jobcontrol.out &

在这里插入图片描述

只有root用户或这特权用户才能提高作业的优先级
使用renice命令可以修改系统中已运行命令的优先级
在这里插入图片描述

定时运行作业

使用at命令可以调度作业,对于定期运行的脚本不方便,而Linux系统使用cron程序调度需要定期执行的作业。
cron在后台运行,会检查一个特殊的cron时间表,从中获取已安排执行的作业

每天的10:15运行一个命令,cron表达式为:15 10 * * * command
每周一的下午4:15执行的命令 15 16 * * 1 command
每月第一天的12点执行命令 00 12 1 * * command

crontab -l 可以列出已有的时间表
在这里插入图片描述

crontab -e会进入一个文件编辑器,添加任务
在这里插入图片描述

如果要执行的脚本精确度要求不高,可以用预设置的cron脚本目录即可,预配置的基础目录共有4个:hourly、daily、monthly和weekly
ls /etc/cron.*ly
在这里插入图片描述

如果你的脚本需要每天执行一次,那么将脚本复制到daily目录,cron就会每天执行它

使用新shell启动脚本

用户登录shell的时候会执行一些启动文件,比如.bash_profile、.bashrc.
在主目录下的.bashrc文件中加入一条简单的echo语句,那么每次启动一个新的shell时都会执行这个语句.
在这里插入图片描述

总结

Linux系统允许使用信号来控制shell脚本。bash shell可以接收信号并将其传给由shell进程生成的所有进程。Linux信号可以轻而易举地杀死失控的进程或暂停耗时的进程。
可以在脚本中用trap命令捕获信号并执行特定命令。这个功能提供了一种简单的方法来控制脚本运行时用户能够将其中断。
在默认情况下,当在终端会话shell中运行脚本时,交互式shell会被挂起,直到脚本运行完毕。你可以在命令后加上一个&符号使脚本或命令以后台模式运行。当在后台模式运行命令或脚本时,交互式shell会被返回,允许你继续输入其他命令。
通过这种方法运行的后台进程仍与终端会话绑定。如果退出终端会话,那么后台进程也会随之退出。nohup命令可以租着这种情况发生。该命令可以拦截任何会导致命令停止运行的信号(比如退出终端会话的信号)。如此一来,即便已经退出了终端会话,脚本也能继续在后台执行。
当将进程置入后台时,仍然可以对其施加控制。jobs命令可以查看shell会话启动的进程。只要知道了后台进程的作业号,就能用kill命令向该进程发送信号,或者用fg命令将该进程带回shell会话的前台。你可以用ctrl+z组合键挂起正在运行的前台进程,也可以用bg命令将其置于后台模式。
nice命令和renice命令可以调整进程的优先级。通过降低进程的优先级,可以使其他高优先级进程获得更多的CPU时间。当运行消耗大量CPU时间的长期进程时,这项特性特别方便。
除了控制处于运行状态的进程,还可以决定何时启动进程。无须直接在命令行界面运行脚本。可以将进程安排在指定时间运行,实现方法不止一种,at命令允许在预设的时间运行脚本,cron程序提供了定时运行脚本的接口,anacron可以确保及时运行脚本(服务器关闭过程中的任务在启动之后会执行)。
最后,Linux系统提供了一些脚本文件,可以让脚本在启动新的bash shell时运行,与此类似,位于用户主目录的启动文件提供了一个位置,以存放新shell启动时需要运行的脚本和命令。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【获奖案例巡展】信创先锋之星——浙江省某市区视频能力中心

为表彰使用大数据、人工智能等基础软件为企业、行业或世界做出杰出贡献和巨大创新的标杆项目,星环科技自2021年推出了“新科技 星力量” 星环科技科技实践案例评选活动,旨在为各行业提供更多的优秀产品案例,彰显技术改变世界的力量&#xff0…

Cycling 74 Max for Mac:音乐可视化编程软件

Cycling 74 Max是一款音乐、视觉、互动艺术等领域中广泛使用的编程语言和应用软件,它允许用户创作和控制实时音频和视频效果、交互式应用程序和媒体艺术品等。 Max将程序设计和可视化编程相结合,通过简单的拖拽和连接方式,用户可以将各种功能…

基于springboot的大学生租房系统源码论文数据库

3.1系统功能 现在无论是在PC上还是在手机上,相信全国所有地方都在进行大学生租房管理。随着经济的不断发展,系统管理也在不断增多,大学生租房系统就是其中一种,很多人会登录到相关的租房系统查看租房信息,还能查看房屋…

微信小程序开发--利用和风天气API实现天气预报小程序

本来是参照《微信小程序开发实战》做一个天气预报小程序的,实际运行的时候提示错误,code 400,参数错误。说明问题应该出在查询API的语句上,没有返回结果。 查阅后才知道,可能书籍出版时间较早,现在的和风获…

类对象

一、类初识 类:表示一种事物所具有的共同特征和行为 对象:一个类的实例 如下图,通过狗这个类进行详解 这是一个Dog类 对象:斗牛犬、小猎犬、牧羊犬 类中的属性:breed(品种)、size(大小)、color(颜色)、age(年龄)、 …

安全常见基础名词概念

一、域名 1、域名:相当网站的名字,互联网上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位。 2、网域名系统(Domain Name System)有时也简称为域名(DNS),是互…

探索【Stable-Diffusion WEBUI】的插件:骨骼姿态(OpenPose)

文章目录 (零)前言(一)骨骼姿态(OpenPose)系列插件(二)插件:PoseX(三)插件:Depth Lib(四)插件:3D …

响应式开发(HTML5CSS3)实现媒体查询的功能案例

目录 前言 一、媒体查询知识点 二、实现功能的尺寸 三、代码部分 1.不带嵌套的媒体查询功能 1.1.代码段 1.2.运行结果 2.带嵌套的媒体查询功能 2.1.代码段 2.2.运行结果 2.2.3视频效果 前言 1.本文讲解的响应式开发技术(HTML5CSS3Bootstrap&#xff09…

Auto-GPT免费尝鲜之初体验-使用攻略和总结

Auto-GPT免费尝鲜之初体验-使用攻略和总结 写在前面的废话一、部署 Auto-GPT二、试运行 Auto-GPT三、我踩过的坑四、后续探索 写在前面的废话 ChatGPT 的交互模式,是和一个 “人” 对话聊天。 如果你想了解更多ChatGPT和AI绘画的相关知识,请参考&#…

ArcGIS Pro用户界面

目录 1 功能区 1.1 快速访问工具栏 1.2 自定义快速访问工具栏 1.3 自定义功能区选项 1.3.1 添加组和命令 1.3.2 添加新选项卡 2 视图 3 用户界面排列 ​编辑 4 窗格 4.1 内容窗格 4.2 目录窗格 4.3 目录视图(类似ArcCatalog) 4.4 浏览对话框…

python:面向对象编程(知识点+代码)

文章目录 一、类和对象1、对象属性的默认值设置2、对象属性的添加、修改与删除3 、类属性 二、类的继承 引言:面向对象编程时一门编程语言重要的功能,我们之前所学的 c,java都为面向对象编程语言,这里给大家拓展一下,…

什么是CDN加速?CDN加速有哪些作用?

一、什么是 CDN CDN 的全称是 Content Delivery Network,即内容分发网络。CDN 是在现有 Internet 基础上增加一层新的网络架构,通过部署边缘服务器,采用负载均衡、内容分发、调度等功能,使用户可以就近访问获取所需内容&#xff…

多维时序 | MATLAB实现BO-CNN-LSTM贝叶斯优化卷积神经网络-长短期记忆网络多变量时间序列预测

多维时序 | MATLAB实现BO-CNN-LSTM贝叶斯优化卷积神经网络-长短期记忆网络多变量时间序列预测 目录 多维时序 | MATLAB实现BO-CNN-LSTM贝叶斯优化卷积神经网络-长短期记忆网络多变量时间序列预测效果一览基本介绍模型搭建程序设计参考资料 效果一览 基本介绍 MATLAB实现BO-CNN-…

2023年报考CSM敏捷教练认证好不好?含金量高吗?

CSM,Certified Scrum Master,是Scrum联盟发起的Scrum认证。帮助个人从自身、团队和组织层面,学习技能和工具来扩展实践的层面,帮助团队正确使用Scrum,从而提高项目整体成功的可能性。 认证收益 职业能力提升 推动企业…

图神经网络能做什么?

从概念上讲,我们可以将图神经网络的基本学习任务分为 5 个不同的方向: (1)图神 经网络方法; (2)图神经网络的理论理解; (3)图神经网络的可扩展性&#xff1b…

VLAN基础实验

实验要求: 1、PC1和PC3所在接口为Access接口 PC2/4/5/6处于同一网段:其中PC2可以访问PC4/5/6 PC4可以访问PC5,但不能访问PC6 PC5不能访问PC6 2、PC1/3与PC2/4/5/6不再同一网段 3、所有PC通过DHCP获取IP地址,且PC1/3可以正常访问PC2/4/5/6 实…

jenkins——环境变量、节点配置以及节点环境变量的使用

这里写目录标题 一、Jenkins 环境变量1、环境变量分类a、系统内置环境变量b、用户自定义环境变量 2、环境变量的使用3、控制台输出 二、Jenkins 节点配置1、Jenkins的常用节点2、准备工作3、SSH类节点配置4、Java web节点配置5、Java web节点配置详细步骤 三、Jenkins 节点环境…

操作系统八股文知识点汇总

1. 程序编译过程 gcc HelloWorld.c -E -o HelloWorld.i 预处理:加入头文件,替换宏。gcc HelloWorld.c -S -c -o HelloWorld.s 编译:包含预处理,将 C 程序转换成汇编程序。gcc HelloWorld.c -c -o HelloWorld.o 汇编:包…

GEE遥感云大数据在林业中的应用

近年来遥感技术得到了突飞猛进的发展,航天、航空、临近空间等多遥感平台不断增加,数据的空间、时间、光谱分辨率不断提高,数据量猛增,遥感数据已经越来越具有大数据特征。遥感大数据的出现为相关研究提供了前所未有的机遇&#xf…

boot-admin整合Quartz实现动态管理定时任务

淄博烧烤爆红出了圈,当你坐在八大局的烧烤摊,面前是火炉、烤串、小饼和蘸料,音乐响起,啤酒倒满,烧烤灵魂的party即将开场的时候,你系统中的Scheduler(调试器),也自动根据…