zoukankan      html  css  js  c++  java
  • Shell编程之Linux信号及信号跟踪

    一、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
    
  • 相关阅读:
    Linux系统挂载点与分区的关系(转载)
    读书笔记深入linux内核架构Chapter 2 part2
    读书笔记深入linux内核架构Chapter 2 part1
    读书笔记深入linux内核架构Chapter9
    读书笔记深入linux内核架构Chapter8part2
    鞋匠的烦恼
    和最大的连续子数组
    wxLog 的使用
    suffix trie
    trie
  • 原文地址:https://www.cnblogs.com/tongxiaoda/p/7483556.html
Copyright © 2011-2022 走看看