首页 > 系统相关 >shell脚本5---信号处理

shell脚本5---信号处理

时间:2023-11-29 18:11:06浏览次数:50  
标签:count shell 信号处理 作业 --- trap 信号 进程

信号的类别

信号 描述
1 SIGHUP 挂起进程
2 SIGINT 终止进程
3 SIGQUIT 停止进程
9 SIGKILL 无条件终止进程
15 SIGTERM 优雅的终止进程
17 SIGSTOP 无条件停止进程,但不是终止进程
18 SIGTSTP 停止或暂停进程,但不是终止进程
19 SIGCONT 继续运行停止的进程

默认情况下,bash shell会忽略收到的任何SIGQUIT(3)和SIGTERM(15)信号(正因为这样交互式shell才不会被意外终止)。但是bash shell会处理收到的SIGHUP(1)和SIGINT(2)信号。

如果bash shell收到SIGHUP信号,它会退出。但在退出之前,它会将信号传给shell启动的所有进程(比如shell脚本)。通过SIGINT信号,可以中断shell,Linux内核停止将CPU的处理时间分配给shell,当这种情况发生时,shell会将SIGINT信号传给shell启动的所有进程。

产生信号
  • 终止进程:ctrl+c
  • 暂停进程:ctrl+z,停止的进程继续保留在内存中,并能从停止的位置继续运行

在无条件终止作业时,开始不会得到任何反应。但下次有shell提示符时,你会看到一个消息说明作业已经被终止了。

$ sleep 100
^Z
[1]+ stopped sleep 100
$
$ kill -9 10650
$
[1]+ Killed sleep 100
$

方括号中的数字时shell分配的作业号。每当shell产生一个提示符时,它就会显示shell中已经改变状态的作业的状态。在你无条件终止一个作业后,下次强制shell生成一个提示符时,shell会产生一条消息,说明作业在运行时被无条件终止了。

捕捉信号

trap命令允许你来指定shell脚本要watch哪些linux信号并从shell中拦截。如果脚本收到了trap命令中列出的信号,它会阻止它被shell处理,而在本地处理。
trap命令的格式:

trap commands signals

signals多个信号用空格隔开。
以下例子用trap命令来捕捉SIGINT和SIGTERM信号

#!/bin/bash

trap "echo 'Sorry! I have trapped Ctrl-C'" SIGINT SIGTERM
count=1
while [ $count -le 10 ]
do 
    echo "Loop #$count"
    sleep 5
    count=$[ $count + 1 ]
done
echo this is the end of the program

当我们执行Ctrl+C时,shell脚本不会中断。

捕捉脚本的退出

要捕捉shell脚本的退出,只要在trap命令后加上EXIT信号就行。

#!/bin/bash
trap "echo Goodbye" EXIT

count=1
while [ $count -le 5 ]
do 
     echo "Loop #$count
      sleep 3
      count=$[ $count + 1 ]
done

执行这个脚本,在脚本执行完成退出前,会输出Goodbye。

移除捕捉
trap -- signals
jobs

参数列表

参数 描述
-l 列出进程的PID以及作业号
-n 只列出上次shell发出的通知后改变了状态的作业
-p 只列出作业的PID
-r 只列出运行中的作业
-s 只列出已停止的作业

jobs输出中会有加号和减号。带加号的作业会被当作默认作业。在使用作业控制命令时,如果未在命令行指定任何作业号,该作业会被当作操作对象。带减号的作业则会在默认作业完成后成为下一个默认作业。任何时候只有一个带加号和一个带减号的作业。

重启停止的作业

在bash作业控制中,可以将已停止的作业作为前台或者后台进程重启。前台进程会接管当前的工作终端。

  • bg <作业号> 重新在后台启动该作业
  • fg <作业号> 重新在前台启动该作业
nice 和 renice

nice命令允许在执行一个命令是调整它的调度优先级。优先级是一个整数值。从-20(最高优先级)到20(最低优先级)。默认情况下,bash shell以优先级0启动所有进程。

nice -n 10 ./test4 > /tmp/test4out &

renice可以改变已运行命令的优先级。

renice 10 -p <PID>

普通用户只能调整属于自己进程的优先级。并且只能降低优先级。
root可以调整任何进程的优先级到任意级别。

计划任务

如何设置一个计划任务在每月的最后一天执行?

00 12 * * * if [ `date +%d -d tomorrow` = 01 ];then <command>;fi

标签:count,shell,信号处理,作业,---,trap,信号,进程
From: https://www.cnblogs.com/lidabo/p/17865529.html

相关文章

  • 11.26-task5-条件
    条件if语句if(condition):后面为condition为trueelse:后面为false布尔表达式的使用:我们知道当布尔值为true是返回值为1,false时返回值为0他的返回值意思是:检查n是否为负数,若为负数n<0为true=1n>=0为false=0,+前面就为1*-n,+后就为0,为正数时逻辑相同ifelse推导式......
  • Android-ActivityResultAPI
    Android-ActivityResultAPI1.推出目的如果你将项目中的appcompat库升级到1.3.0或更高的版本,你会发现startActivityForResult()方法已经被废弃了。现在更加建议使用ActivityResultAPI来实现在两个Activity之间交换数据的功能。2.传统写法-在两个Activity之间交换数据如......
  • Ant-Design modal对话框未打开时,无法通过uesRef获取modal内部元素DOM节点
    为什么要记录下来呢?因为我在网上和chatGpt上没有搜到合适的解决方案。在CDNS上看到个和我遇到问题一样的,居然要收费才能看,所以自己记下来。当然肯定还有其他的好方案,欢迎大家留言。需求:使用antdV/g6画关系图,类似于企查查上面的那样:点击按钮打开Modal框,把数据渲染到Modal框的div......
  • 11.29-task5-代码风格
    代码风格代码风格介绍修饰代码的前提是代码没有bug。。。两幅图中的代码对比,显然后一幅图的代码更加简洁,易懂。也方便之后很长时间后的再理解。缩进tab==4个空格当函数有多参数时换行当一个语句的字符数过长,要换行运算符对齐导入规范导入时要遵循同级文......
  • Golang-常见数据结构实现原理
    chan 1.chan数据结构 src/runtime/chan.go:hchan定义了channel的数据结构:typehchanstruct{qcountuint//当前队列中剩余元素个数dataqsizuint//环形队列长度,即可以存放的元素个数bufunsafe.Pointer//环形队列指针......
  • JacksonUtils - 封装基于 jackson 的 json 转换逻辑代码
    JacksonUtils.javapackageorg.example.util;importcom.fasterxml.jackson.core.JsonProcessingException;importcom.fasterxml.jackson.databind.JavaType;importcom.fasterxml.jackson.databind.JsonNode;importcom.fasterxml.jackson.databind.ObjectMapper;im......
  • 性能测试监控--Prometheus
    随着业务的增长,服务器部署由单一架构向分布式集群架构转变,性能测试过程中指标监控也由单一服务器向集群服务器转变。 对于性能测试团队来说,需要建立起适用于测试的多机监控系统,以便后期顺利且高效地进行监控分析调优,从而保证整个测试过程的高可靠性。 因此,小编本期为大家讲......
  • D2. Xor-Subsequence (hard version)
    D2.Xor-Subsequence(hardversion)Itisthehardversionoftheproblem.Theonlydifferenceisthatinthisversion$a_i\le10^9$.Youaregivenanarrayof$n$integers$a_0,a_1,a_2,\ldotsa_{n-1}$.Bryapwantstofindthelongestbeautifulsub......
  • 大型数据库实验八--Flink初级编程实践
    ......
  • Android踩坑小记-在onResume中申请权限
    Android踩坑小记-在onResume中申请权限最近遇见一个问题,在onResume中申请权限,比如申请定位权限,如下所示:@OverrideprotectedvoidonResume(){super.onResume();requestPermission();}@TargetApi(Build.VERSION_CODES.M)privatevoidr......