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命令后面的INT都可以換,在trap -l命令中也說明了可以換的信號。但是我們要知道自己准確無誤的發送信號。比如將INT換成STOP(19)之后,再次運行腳本時按下ctrl+c組合鍵是不管用的。因為發送的信號不對應,trap命令不能執行。
我們可以這樣子看效果:
那接下來我修改一下程序:
我將上面的shell腳本中的trap命令后面跟的接收信號的類型修改成STOP(19)。
看一下效果:
其實最后這個STOP也不是終止程序,只是暫停程序而已。