一、Linux信号

1.什么是信号?

Linux信号是由一个整数构成的异步消息,它可以由某个进程发给其他进程,也可以在用户按下特定键发生某种异常事件时,由系统发给某个进程。

2.信号列表

[root@codis-178 ~]# 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

3.使用trap控制信号

用途:

  • 在脚本程序被中断时完成清理工作
  • 屏蔽用户非法使用的某些信号

trap命令:

trap command signal

说明:

  • command 接收到指定信号时将要采取的行动
  • signal 要处理的信号名

(1)测试trap命令捕获ctrl + c信号

[root@codis-178 ~]# trap 'echo oldboy' 2
[root@codis-178 ~]# ^Coldboy [root@codis-178 ~]# ^Coldboy [root@codis-178 ~]# trap 'echo oldgirl' INT
[root@codis-178 ~]# ^Coldgirl

stty可以列出中断信号与键盘的对应信息

[root@codis-178 ~]# stty -a
speed 38400 baud; rows 34; columns 192; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O;
min = 1; time = 0;
-parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts -cdtrdsr
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke

(2)测试按下ctrl + c组合键而引发的INT(2)信号

[root@codis-178 ~]# trap "" 2
[root@codis-178 ~]# trap ":" 2
[root@codis-178 ~]# ^C
[root@codis-178 ~]# trap "echo -n 'you are typing ctrl+c'" 2
[root@codis-178 ~]# ^Cyou are typing ctrl+c
[root@codis-178 ~]# ^Cyou are typing ctrl+c

(3)同时处理多个信号

[root@codis-178 ~]# trap "" 1 2 3 20 15
[root@codis-178 ~]# trap ":" 1 2 3 20 15
[root@codis-178 ~]# ^C
[root@codis-178 ~]# trap "" `echo (1..64)` #屏蔽1-64的所有信号

4.企业应用

(1)实现触发信号后清理文件的功能

[root@codis-178 ~]# cat 17_1.sh
#!/bin/bash
#Author:xiaoda
#Time:2017-09-06 10:47:59
#Name:17_1.sh
#Version:V1.0
#Description:This is a test script trap "find /tmp -type f -name "oldboy_*"|xargs rm -f && exit" INT
while true
do
touch /tmp/oldboy_$(date +%F-%H-%M-%S)
sleep 3
ls -l /tmp/oldboy*
done
[root@codis-178 ~]# sh 17_1.sh
-rw-r--r-- 1 root root 0 Sep 6 10:50 /tmp/oldboy_2017-09-06-10-50-54
-rw-r--r-- 1 root root 0 Sep 6 10:50 /tmp/oldboy_2017-09-06-10-50-54
-rw-r--r-- 1 root root 0 Sep 6 10:50 /tmp/oldboy_2017-09-06-10-50-57
-rw-r--r-- 1 root root 0 Sep 6 10:50 /tmp/oldboy_2017-09-06-10-50-54
-rw-r--r-- 1 root root 0 Sep 6 10:50 /tmp/oldboy_2017-09-06-10-50-57
-rw-r--r-- 1 root root 0 Sep 6 10:51 /tmp/oldboy_2017-09-06-10-51-00
^C[root@codis-178 ~]# ls -l /tmp
total 4
drwxr-xr-x 2 root root 4096 Sep 5 18:40 hsperfdata_root
srwxrwxrwx 1 mysql mysql 0 Feb 9 2017 mysql.sock

(2)企业级Shell跳板机

要求用户登录到跳板机后只能执行管理员给定的选项动作,不允许以任何形式中断脚本而到跳板机服务器上执行系统命令。

echo '[ $UID -ne 0 ] && . /server/scripts/jump.sh' >/etc/profile.d/jump.sh

[root@codis-178 ~]# cat jump.sh
#!/bin/bash
#Author:xiaoda
#Time:2017-09-06 10:56:56
#Name:jump.sh
#Version:V1.0
#Description:This is a test script trapper(){
trap ":" INT EXIT TSTP TERM HUP
} main(){
while :
do
trapper
clear
cat <<menu
1)WEB01-192.168.1.1
2)WEB01-192.168.1.2
3)DB01-172.16.1.1
menu
read -p "Pls input a num:" num
case "$num" in
1)
echo 'login in 192.168.1.1'
2)
echo 'login in 192.168.1.2'
3)
echo 'login in 172.16.1.1'
*)
echo 'select error.'
esac
done
}
main

Shell编程之Linux信号及信号跟踪的更多相关文章

  1. shell编程之awk命令详解

    shell编程之awk命令详解 a:focus { outline: thin dotted #333; outline: 5px auto -webkit-focus-ring-color; out ...

  2. 03 shell编程之case语句与函数

    本文所有内容均来自当年博主当年学习笔记,若有不足欢迎指正 Shell编程之case语句与函数 学习目标: 掌握case语句编程 掌握shell函数的使用 目录结构: Case语句 Case语句的作用 ...

  3. shell编程之case分支语句

    shell编程之case分支语句 case分支语句和if的多分支语句很相似. if多分支语句一般用在有(区间范围)的地方 :例如:0-100之间. if需要判断多个不同的条件. case的分支语句用在 ...

  4. shell编程之if语句

    shell编程之if判断 目录 shell编程之if判断 1.整数比较 2.字符串比较 3.举例 1.数字比较 2.字符串比较 4.Other 1.整数比较 -eq 等于,如:if [ "$ ...

  5. shell编程之sed编辑器&gawk程序

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://twentyfour.blog.51cto.com/945260/560372 s ...

  6. 多线程编程之Linux环境下的多线程(二)

    上一篇文章中主要讲解了Linux环境下多线程的基本概念和特性,本文将说明Linux环境下多线程的同步方式. 在<UNIX环境高级编程>第二版的“第11章 线程”中,提到了类UNIX系统中的 ...

  7. Shell编程之Expect自动化交互程序

    一.Expect自动化交互程序 1.spawn命令 通过spawn执行一个命令或程序,之后所有的Expect操作都会在这个执行过的命令或程序进程中进行,包括自动交互功能. 语法: spawn [ 选项 ...

  8. shell编程之trap命令

    trap command  signal trap捕获信号(软中断),command一般是linux命令 若为' '表示发生陷阱时为空指令,'-'表示发生陷阱时采用缺省指令 signal: HUP(1 ...

  9. shell编程之BASH变量(2)

    变量命名规范 在bash中,变量的默认类型都是字符串型,定义 name = 'kk' 变量分类 用户自定义变量.变量自定义的 环境变量:这种变量中主要保存的是和系统操作环境相关的数据.变量可以自定义, ...

随机推荐

  1. python __new__ __init__ __del__

    1.python实例化顺序是.__new__ -->__init__ --> __del__ 2.如果重写new没return,就实例化不成功

  2. Linux命令之split

    split用来将大文件分割成小文件.有时文件越来越大,传送这些文件时,首先将其分割可能更容易. 使用vi或其他工具诸如sort时,如果文件对于工作缓冲区太大,也会存在一些问题. 因此有时没有选择余地, ...

  3. 爬虫实战【5】送福利!Python获取妹子图上的内容

    [插入图片,妹子图首页] 哈,只敢放到这个地步了. 今天给直男们送点福利,通过今天的代码,可以把你的硬盘装的满满的~ 下面就开始咯! 第一步:如何获取一张图片 假如我们知道某张图片的url,如何获取到 ...

  4. eclipse下设置tomcat,修改Java代码不必重启tomcat

    1.本文目的:用tomcat进行web开发时,修改Java代码往往要重启代码,当工程较大启动较慢时,严重影响效率,本文通过eclipse下tomcat开发和发布web程序时,对一些Java代码一般修改 ...

  5. [Node.js] require背后的故事

    前言 熟悉Node.js的肯定对下面的代码熟悉 var http = require('http'); 这段代码很好理解,就是加载一个http模块.但是你有没有想过为什么要这么写?这其中的缘由是什么呢 ...

  6. RedHat6/Centos6.5安装mongodb php driver

    条件: 安装apache 安装php 1.下载mongodb phh driver 下载地址:pecl wget http://pecl.php.net/get/mongo-1.5.8.tgz 2.解 ...

  7. php-fpm 启动 关闭 进程逃逸 pid

    正常关闭失败 [root@d personas]# /etc/init.d/php-fpm stopGracefully shutting down php-fpm /etc/init.d/php-f ...

  8. git commit -a -m "DM 1、获取aliOssSTS值,计算签名,实现视频PUT/POST2种上传方式上传;"

    git commit -a -m "DM 1.获取aliOssSTS值,计算签名,实现视频PUT/POST2种上传方式上传:" 微信小程序的视频上传

  9. 【题解】CF611H New Year and Forgotten Tree

    [题解]CF611H New Year and Forgotten Tree 神题了... 题目描述 给定你一棵树,可是每个节点上的编号看不清了,只能辨别它的长度.现在用问号的个数代表每个节点编号那个 ...

  10. jdbc PreparedStatement 防止sql注入的关键代码片段

    mysql-connector-java-5.1.38.jar PreparedStatement 的 setString(int parameterIndex, String x) 方法 for ( ...