一、概述

我们在上一章当中示例了检测ip地址是否在线的脚本,但是有一个问题,运行的过程中,无论使用Ctrl+c怎么制止,并没有什么卵用,还是继续运行,直到将最后一个IP地址ping完,无法制止,只是将当前的ping操作结束,下一个ping操作就要运行,但是如果连续的按下快捷键,总有一个信号捕捉到,但只有被当前进程的脚本捕捉到才能够停止,而不是ping进程,这就是信号。

我们也可以手动定制信号捕捉的功能,那么如何自定义信号捕捉的处理,那么在ping操作时,由于信号捕捉不到,那么能不能在捕捉信号之后做出相应的处理操作,对于bash而言这是可以的,在系统当中有一个trap命令,通过部署一个陷阱捕捉到信号,或者激发其某个事件进行捕捉处理。

我们可使用-l选项来列出可捕捉的所有信号。

# trap -l

1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP

6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1

11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM

16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP

21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ

26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR

31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3

38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8

43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13

48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12

53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7

58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2

63) SIGRTMAX-1 64) SIGRTMAX

不过,使用kill -l也是获得相同的结果,不过要想了解其信号意义,我们可通过man手册来进行查看。

信号捕捉:

列出信号:

trap -l

kill -l

man 7 signal

信号是进程间通信间的一种机制,而trap命令可以让bash脚本自定义如何捕捉信号,但需要注意的是,不能捕捉TERM和KILL的信号,因为捕捉信号的意义在于一旦捕捉到之后能够作出什么操作,因此一般捕捉到信号为HUP以及INT等,当然其它的信号也可以捕捉,但是没有以上这两个用的那么频繁。

常用的信号:

HUP, INT

示例:

#!/bin/bash

trap 'echo "Dou ni wan"' INT

for i in {1..254}; do

if ping -W1 -c1 192.168.$i.1 &> /dev/null; then

echo "192.168.$i.1 is up."

else

echo "192.168.$i.1 is down."

fi

done

# bash trap.sh

192.168.1.1 is down.

192.168.2.1 is down.

^CDou ni wan

192.168.3.1 is down.

^CDou ni wan

192.168.4.1 is down.

^CDou ni wan

192.168.5.1 is down.

^CDou ni wan

192.168.6.1 is down.

从以上的运行结果看出,一旦发出Ctrl+c就是INT信号后,会显示出Dou ni wan,但是其实并没有停止其ping进程,只是停止了当前的ping,而下一个循环的ping开始运行,如果彻底退出的当前bash进程的话,要用另一种方式。

#!/bin/bash

trap 'echo "quit"; exit 1' INT

for i in {1..254}; do

if ping -W1 -c1 192.168.$i.1 &> /dev/null; then

echo "192.168.$i.1 is up."

else

echo "192.168.$i.1 is down."

fi

done

那么这就是trap命令的意义,能够其捕捉信号,且捕捉到信号后,使用所定义好的命令来进行处理如何进行,那么以上的信号处理就是显示quit并退出shell进程。

那么trap命令的方法很简单,后面跟上其参数,并跟上信号声明,而一旦捕捉到其信号之后,我们作出什么样的处理操作,而它的命令用法为:

trap 'COMMAND' SIGNALS

我们可以使用以函数中所定义好的命令的形式来对trap进行定义而后对其进行捕捉。

#!/bin/bash

#

trap 'mytrap' INT

mytrap() {

echo "Quit"

exit 1

}

for i in {1..254}; do

if ping -W1 -c1 192.168.$i.1 &> /dev/null; then

echo "192.168.$i.1 is up"

else

echo "192.168.$i.1 is down"

fi

done

而在每次ping操作完成之后,可创建其临时文件保存其相关的信息。放在循环内部,每一次创建完成可保证将其可以删除,也需要保证三叉输出。

但是这样的话会创建无数个临时文件,我们需要创建其数组用来其追加到最后一个元素中,遇到终止信号时将其文件进行删除。

#!/bin/bash

#

declare -a hosttmpfiles

trap 'mytrap' INT

mytrap() {

echo "Quit"

rm -f ${hosttmpfiles[@]}

exit 1

}

for i in {1..254}; do

tmpfile=$(mktemp /tmp/ping.XXXXXX)

if ping -W1 -c1 192.168.$i.1 &> /dev/null; then

echo "192.168.$i.1 is up" | tee $tmpfiles

else

echo "192.168.$i.1 is down" | tee $tmpfiles

fi

hosttmpfiles[${#hosttmpfiles[*]}]=$tmpfile

done

echo ${hosttmpfiles[@]}

在信号捕捉中的函数内部可以写出一些复杂的处理逻辑,包括退出及删除未处理的文件等。

二、在bash中使用ASCII颜色

在echo命令中如何进行着色是一件很简单的事情,关于相关的教程网上也是一抓一大把,那么其着色定义格式为:

\033[31m hello \033[0m

以上这种格式表示随后控制的字体显示为什么颜色,以及在那里进行关闭,如果没有关闭的话随后都是以这个颜色进行显示,除非到下一个命令有自己的输出流时才能结束,为了避免这种影响,所以要在后面需加上\033[0m,表示不要影响其后面的着色,就在这个范围内进行着色。

而那两个数字也有个不同的意义。

##m:

左侧#:

3: 前景色;

4: 背景色;

右侧#: 颜色种类

1, 2, 3, 4, 5, 6, 7

如果使用的是单个数字的话,会改变文本的格式,例如加粗或闪烁等。

#m:

加粗、闪烁等功能;

多种控制符,可组合使用,彼此间用分号隔开;

echo -e "\033[42;35;5,hello world\033[0m"

linux如何捕获9的信号,2018-9-17-bash之信号捕捉相关推荐

  1. Linux系统编程【文件IO、进程、进程间通信、信号、线程、互斥】

    linux系统编程 个人通过学习,手打了一份48000字的Linux系统编程的笔记,包含了[文件IO.进程.进程间通信.信号.多线程.互斥]等知识点,并给出了大量的代码案例对每个重要的知识点进行了代码 ...

  2. 【Linux】进程信号“疑问?坤叫算信号吗?“

    鸡叫当然也算信号啦~ 文章目录 前言 一.认识信号量 二.信号的产生 1.调用系统函数向进程发信号 2.由软件条件产生信号 3.硬件异常产生信号 总结 前言 信号在我们生活中很常见,下面我们举一举生活 ...

  3. Linux系统捕获数据包流程

    Linux系统捕获数据包流程 为了提高数据包的捕获效率,瓶颈问题是一个需要非常关注的焦点.减少在捕获数据包过程中的瓶颈,就能够提高数据包捕获的整体性能.下面本文将以Linux操作系统为平台,分析捕获数 ...

  4. Linux C编程--进程间通信(IPC)3--信号集和发送信号介绍

    Linux信号集 1.信号集概念 信号集是一个能表示多个信号的数据类型,sigset_t set :set即一个信号集. 既然是一个集合,就需要对集合进行添加/删除等操作. int sigemptys ...

  5. 如何在Linux系统下的IntelliJ IDEA 2018.3.5下载与安装以及激活教程

    如何在Linux系统下的IntelliJ IDEA 2018.3.5下载与安装以及激活教程 作者:张国军_Suger 开发工具与关键技术:VMware Workstation Pro.Linux系统( ...

  6. Linux信号编程实践(二) 信号发送函数和可重入函数

    在早期的UNIX中信号是不可靠的,不可靠在这里指的是:信号可能丢失,一个信号发生了,但进程却可能一直不知道这一点. 现在Linux 在SIGRTMIN实时信号之前的都叫不可靠信号,这里的不可靠主要是不 ...

  7. linux 手机 wlan信号桥,手机WLAN信号桥是什么?WLAN信号的作用和使用方法

    什么是寒假必备?温暖的被窝和wifi绝对是不能少的.今天就给大家介绍一下和手机WIFI有关的WLAN信号桥的知识,让大家在寒假享受WIFI又多了一种选择.感兴趣的可以一起来看看. 一.什么是WLAN信 ...

  8. linux医院项目,LinuxONE Inside的医院就是好医院?!(上)丨IBM超in播2018第17期

    原标题:LinuxONE Inside的医院就是好医院?!(上)丨IBM超in播2018第17期 咱们大家都有去医院看病的经历,现在医院的挂号.取药.交费等环节都离不开信息系统的支持.在给患者带来便利 ...

  9. 32.全网最详细trap讲解,trap语法格式,信号和用途,最常用的信号,trap常用的命令,ctrl + c,信号屏蔽和恢复,trap -,debug,exit,return示例,三个综合案例

    文章目录 语法详解 trap格式 信号和用途 最常用的信号 trap常用的命令 示例 ctrl + c 示例 信号屏蔽和恢复 trap - 示例 debug示例 exit示例 return示例 综合案 ...

  10. linux web高级编程,寒假学习 第16.17天 (linux 高级编程)

    寒假学习 第16.17天 (linux 高级编程) 笔记 总结 一.进程的基本控制(进程的同步) 1.进程的常见控制函数 pause   sleep/usleep atexit   on_exit i ...

最新文章

  1. 角色转移服务器维护怎么回事,服务器互通及游戏角色转移说明
  2. LSGO代码小组第16周复盘日志
  3. 硬件:路由器的基础知识
  4. windows:QtCreator调用库的方式
  5. 【linux】RedHat 安装 gcc、g++
  6. 怎么两边同时取ln_羊肉汤怎么炖才好喝?小猫教你这么做,做出来汤浓白,好喝无膻味...
  7. 语义分割——上采样插值resize的学习笔记
  8. Snagit 2019 for Mac(最好用的截图软件)v2019.1.11汉化版 MacOS 11 Big Sur支持
  9. [OpenBMC] 快速上手OpenBMC的Redfish
  10. 精选6个PPT模板网站,完全免费,速速收藏
  11. 网课答题查题公众号助手搭建教程
  12. left join一对多只保留一条结果的解决方法
  13. 从键盘输入某年某月某日,判断这一天是这一年的第几天啊?
  14. 不同局域网之间socket通信
  15. Event的三个阶段:CAPTURING_PHASE,AT_TARGET,BUBBLING_PHASE
  16. 盘点测试分析工具资源,文章教程/视频教程等你来体验!
  17. 2014522420145238 《信息安全系统设计基础》第二次实验
  18. Session超时管理以及Session实现自动登录——java web实验
  19. ffmpeg学习 函数分析sws_scale
  20. MySQL中LAG()函数和LEAD()函数的使用

热门文章

  1. MyBatis(4)动态SQL
  2. 阿里云服务器tomcat配置https
  3. CentOS 6.5 svn服务器2.0版
  4. 《DB2性能管理与实战》导读
  5. Tomcat7和mysql连接池dbcp方式的配置方法和测试
  6. 3D 音频技术产品介绍(1):Iosono the future of spatial audio
  7. 两个链表生成相加链表
  8. (大纲)三小时学会openCV
  9. docker离线包相关脚本编写示例:docker镜像load/push/save脚本
  10. etcd介绍:可作为KV数据库、服务发现、配置中心和分布式锁使用、etcd集群搭建