• 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
    
  • 相关阅读:
    JVM常用参数设置
    Jstat在分析java的内存GC时的应用
    jstack来分析linux服务器上Java应用服务性能异常
    linux 远程连接服务器ftp命令整理
    LR11中webservice协议的性能测试应用
    Windbg在.net性能问题排查hang情况的应用思路
    Windbg基本命令应用总结
    LR11直接对数据库访问操作方法在性能测试中的应用总结
    BenchmarkSQL v5.0测试达梦数据库
    SSH登录时间久,登录后报错:'abrt-cli status' timed out
  • 原文地址:https://www.cnblogs.com/tongxiaoda/p/7483556.html
Copyright © 2020-2023  润新知