我们ping一个主机,然后按下ctrl+c那么就会终止这个ping动作,如下图:

可是如果使用一个循环来逐个ping不同主机,你再按下ctrl+c就会发现停不下来,直到循环完成,如下图:

#!/bin/bash

NETWORK=172.16.42.

# -W 表示超时时长  -c 是发送几个ping包
for IP in {1..20}; do
ping -W 1 -c 10 ${NETWORK}${IP}
done

脚本没有停止而是依然继续执行,但是你发现172.16.42.1是通的,而且我们通过-c参数应该是ping 10次,当完成第5次ping的时候,我们按下ctrl+c它就不再ping这个地址,而是开始ping 172.16.42.2这个地址。这就是ctrl+c的真正含义,它的作用是终止当前正在执行的操作,脚本中循环20次,每次执行一个ping操作,所以ctrl+c仅仅终止的是其中一个ping操作而不是整个脚本。

不过这么解释并不完全正确,因为你要知道ctrl+c是发送中断信号,到底是应该终止ping操作还是这个脚本,取决于捕捉到这个中断信号的程序,如果是ping捕捉到了,那么就终止ping操作;如果是执行这个脚本的进程捕捉到就终止这个脚本的执行。那么我们如何设置捕捉一个信号呢?就使用trap这个内置的shell命令。

trap -l显示系统信号[1]kill -l也是可以显示的。

trap命令不能捕捉SIGKILL和SIGTERM这两个信号。捕捉信号的目的是一旦信号到达我们针对信号做什么处理,如果捕捉SIGKILL并且你修改了行为,这就意味着这个进程刀枪不入了,这显然不行。一般我们捕捉SIGHUP、SIGINT等。

针对上面的例子如何修改呢?

#!/bin/bash

# 捕捉INT,然后执行exit 1,该命令通常写在脚本第一行
trap 'exit 1' INT NETWORK=172.16.42.
# -W 表示超时时长 -c 是发送几个ping包
for IP in {1..20}; do
ping -W 1 -c 10 ${NETWORK}${IP}
done

再次运行这个脚本那么依然会执行循环,但是trap并不执行而是一直等着信号发生,我们使用的ctrl+c其实就是SIGINT信号。这个脚本的含义就是shell捕捉信号,所以shell捕捉到以后就会执行响应动作,我们这里是trap 'exit 1' INT捕捉SIGINT然后执行exit 1,当shell执行这个命令时也就意味着退出了,所以无论for循环是否执行完毕它都随着脚本的退出而终止。

如果你想让捕捉信号时做更多操作,你可以使用函数的方式,如下代码:

#!/bin/bash

trap 'sig_handler' INT
sig_handler(){
echo "Quit"
exit 1
} NETWORK=172.16.42.
# -W 表示超时时长 -c 是发送几个ping包
for IP in {1..20}; do
ping -W 1 -c 10 ${NETWORK}${IP}
done

也就是突然终止后需要做一些收尾的清理操作,你就可以通过上面自定义一个函数来执行。


  1. 信号是进程间通信的一种方式 ↩︎

bash信号捕捉的更多相关文章

  1. Linux控制脚本:信号捕捉,作业控制,调整谦让度,以及计划任务

    1.关于信号以及信号捕捉 (1) $ ps  -au可以用来查看所有作业,包括暂停的和停止的,当然还有正在运行的. 在STAT这一列表示各个作业的状态,S表示Stop,R表示Run,T表示被追踪的或停 ...

  2. Linux 信号捕捉

    pause函数 pause函数挂起调用它的进程,直到有任何消息到达. 调用进程必须有能力处理送达的信号,否则信号的默认部署就会发生. int pause(void); 只有进程捕获到一个信号的时候pa ...

  3. Linux系统编程—信号捕捉

    前面我们学习了信号产生的几种方式,而对于信号的处理有如下几种方式: 默认处理方式: 忽略: 捕捉. 信号的捕捉,说白了就是抓到一个信号后,执行我们指定的函数,或者执行我们指定的动作.下面详细介绍两个信 ...

  4. caffe之路-SIGTERM信号捕捉

    Caffe在1.0版本仅支持两种信号的处理: 1) SIGHUP 2) SIGINT SIGHUP:caffe接收到此信号后进行snapshot,并不会中断caffe的训练. SIGINT:caffe ...

  5. shell信号捕捉命令 trap

    trap 命令 tarp命令用于在接收到指定信号后要执行的动作,通常用途是在shell脚本被中断时完成清理工作.例如: 脚本在执行时按下CTRL+c时,将显示"program exit... ...

  6. PHP进程之信号捕捉中的declare(ticks=1)

    转自:http://blog.csdn.net/gavin_new/article/details/65629223 一. 语句在php中的意义 php中,declare(ticks=n)和regis ...

  7. 信号处理函数(3)-sigaction() 为信号注册信号捕捉函数

    定义: int sigaction(int signum,const struct sigaction *act ,struct sigaction *oldact); 表头文件: #include& ...

  8. linux SIGSEGV 信号捕捉,保证发生段错误后程序不崩溃

    在Linux中编程的时候 有时候 try catch 可能满足不了我们的需求.因为碰到类似数组越界 ,非法内存访问之类的 ,这样的错误无法捕获.下面我们介绍一种使用捕获信号实现的异常 用来保证诸如段错 ...

  9. bash编程的信号捕获:

    bash编程的信号捕获: kill -l KILL无法捕捉:   trap 'COMMAND' SIGNAL,    信号捕捉用于:在中途中止时做一些清理操作.   一. trap捕捉到信号之后,可以 ...

随机推荐

  1. jmeter压测学习8-压测带token的接口

    前言 工作中我们需要压测的接口大部分都是需要先登陆后,带着token的接口(或者带着cookies),我们可以先登陆获取token再关联到下个接口. 比如我现在要压测一个修改用户的个人信息接口,每个用 ...

  2. os模块补充以及序列化模块

    os模块补充以及序列化模块   一.os模块的补充 1.os.path.abspath 能把存在的相对路径的绝对路径显示出来 path = os.path.abspath("连达day19. ...

  3. 201871010104-陈园园 《面向对象程序设计(java)》第七周学习总结

    201871010104-陈园园 <面向对象程序设计(java)>第七周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...

  4. django学习-数据库操作接口API--(CRUD)

    初试API(数据库操作接口CRUD) 现在我们进入交互式python命令行,尝试一下django为你创建的各种API,通过以下命令打开python命令行: py -3 manage.py shell进 ...

  5. 深度学习的encoder和decoder

    所谓编码,就是将输入序列转化成一个固定长度的向量:解码,就是将之前生成的固定向量再转化成输出序列.

  6. Git的回滚

    Git常用命令: git add .   #进行提交 git commit -m v2 #v2版本 cat index.html #查看文件内容已经变化 git log #获取到提交信息 git re ...

  7. Windows开机自动登陆 开/关:登录需按Ctrl+Alt+del的功能

    Win10.Win7.WinXP开机自动登录: Win+R组合键打开“运行”,输入“netplwiz” 在弹出的“用户帐户”窗口中,把取消勾选“要使用本机,用户必须输入用户名和密码”,然后“应用”. ...

  8. bower安装教程

    进入node.js官网下载相应操作系统的安装文件http://www.nodejs.org/download/ ,windows环境下载msi文件即可 打开下载的文件,一直点击下一步,完成安装 安装完 ...

  9. C# HTTP系列6 HttpWebResponse.StatusCode 响应代码中文详解

    系列目录     [已更新最新开发文章,点击查看详细] 1xx - 信息提示 这些状态代码表示临时的响应.客户端在收到常规响应之前,应准备接收一个或多个 1xx 响应 · 100 - Continue ...

  10. 关于DataTable内部索引已损坏的问题 System.Data.RBTree

    1.错误提示: 最近,Winform程序在极其偶然的情况下会遇到如下错误提示 Framework 版本: v4.0.30319 说明: 由于未经处理的异常,进程终止. 异常信息: System.Inv ...