trap命令的实战用法

时间:2022-10-31 12:59:15

trap命令:

  trap命令是专用于捕捉信号的。比如像ctrl+c发送给终端的中断信号等等。在捕捉到信号之后,可以进行一系列的操作。

  用法:trap  'COMMAND' INT           

    COMMAND表示trap命令接收到INT信号后要执行的动作什么。

  可以捕捉的信号有:HUP  INT等

  不适用捕捉的信号:KILL   TERM

使用trap -l命令可以查看信号有哪些:

[root@ELK-chaofeng test]# 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    

案例演示:

[root@ELK-chaofeng test]# cat test11.sh 
#!/bin/bash
#
declare -a hosttmpfiles
trap 'mytrap' INT

mytrap(){
    echo "Now,you are doing the QUIT"
    rm -rf ${hosttmpfiles[@]}
    exit 1
}

for i in {1..50};do
    tmpfile=$(mktemp /tmp/ping.XXXXXX)
    if ping -W1 -c 1 192.168.$i.1 &> /dev/null;then
        echo  "192.168.$i.1 is up" | tee $tmpfile
    else
        echo "192.168.$i.1 is down" | tee $tmpfile
    fi
    hosttmpfiles[${#hosttmpfiles[*]}]=$tmpfile
done
rm -rf ${hosttmpfiles[@]}

效果:

trap命令的实战用法

这个例子中,trap命令的执行语句是调用一个函数,然后函数内执行退出动作。trap命令后面的INT都可以换,在trap -l命令中也说明了可以换的信号。但是我们要知道自己准确无误的发送信号。比如将INT换成STOP(19)之后,再次运行脚本时按下ctrl+c组合键是不管用的。因为发送的信号不对应,trap命令不能执行。

 我们可以这样子看效果:

trap命令的实战用法

那接下来我修改一下程序:

 我将上面的shell脚本中的trap命令后面跟的接收信号的类型修改成STOP(19)。

trap命令的实战用法

看一下效果:

trap命令的实战用法

 其实最后这个STOP也不是终止程序,只是暂停程序而已。