前言
当我们在运行某一段代码的时候,希望有类似事物一样的操作,要么成功,要么失败;一般的shell脚本都是自上而下,从左之后运行,碰到异常信号就会出错,从而终止脚本的运行,这个时候脚本可能运行到某一处数据写入操作的时候,强迫停止,从而造成重大失误,trap可能帮助我们尽量减少这个问题,记住是尽量减少,不等于全部避免。
trap
允许你监听指定的信号,并对相应的信号做出对应的反应;
格式
trap commands signals
注意:这里的commands就是在捕获signals信号之后做出的相应反应;捕获信号可以用来做防御操作,也可以用来做进攻操作。
选项
-l 列出trap的相关信号
Linux信号大全
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
trap常见的几种操作
trap "commands" signal-list # 当脚本收到signal-list清单内列出的信号时,trap命令执行双引号中的命令。 trap signal-list # trap不指定任何命令,接受信号的默认操作,默认操作是结束进程的运行。 trap " " signal-list # trap命令指定一个空命令串,允许忽视信号,我们常用到的就是这一种。 trap -- signal-list # 删除trap的捕获动作
注意:请记住,脚本程序通常是以从上到下的顺序解释执行的,所以必须在你想保护的那部分代码以前指定trap命令,在不想保护的部分,添加删除捕获动作;
示例1
#!/bin/bash # test trap command trap "echo 'Sorry! I have trapped Ctrl-C'" SIGINT echo This is a test script count=1 while [ $count -le 10 ] do echo "Loop $count" sleep 1 count=$[ $count + 1 ] done echo The end.
运行结果
This is a test script Loop 1 Loop 2 ^CSorry! I have trapped Ctrl-C Loop 3 Loop 4 ^CSorry! I have trapped Ctrl-C Loop 5 Loop 6 Loop 7 Loop 8 ^CSorry! I have trapped Ctrl-C Loop 9 Loop 10 The end.
示例2
#!/bin/bash # 除了在shell脚本中捕获信号外,也可以在shell退出时捕获,在trap命令后加上EXIT信号就行。 # test trap command trap "echo Goodbye." EXIT echo This is a test script count=1 while [ $count -le 10 ] do echo "Loop $count" sleep 1 count=$[ $count + 1 ] done echo The end.
运行结果
This is a test script Loop 1 Loop 2 Loop 3 Loop 4 Loop 5 Loop 6 Loop 7 Loop 8 Loop 9 Loop 10 The end. Goodbye.
示例3
#!/bin/bash # 修改trap操作 # test trap command trap "echo 'Sorry! I have trapped Ctrl-C'" SIGINT count=1 while [ $count -le 5 ] do echo "Loop $count" sleep 1 count=$[ $count + 1 ] done trap "echo 'Sorry! The trap has been modified.'" SIGINT count=1 while [ $count -le 5 ] do echo "Loop $count" sleep 1 count=$[ $count + 1 ] done echo The end.
运行结果:
Loop 1 Loop 2 Loop 3 ^CSorry! I have trapped Ctrl-C Loop 4 Loop 5 Loop 1 Loop 2 Loop 3 ^CSorry! The trap has been modified. Loop 4 Loop 5 The end.
示例4
#!/bin/bash trap "echo 'Sorry! This is FOR!'" SIGINT for ((i=1; i<=10; i++)) do echo "$i" sleep 0.1 done trap -- SIGINT for ((i=10; i<=20; i++)) do echo "$i" sleep 0.1 done
运行结果:
1 2 3 4 5 ^CSorry! This is FOR! 6 7 8 ^CSorry! This is FOR! 9 10 10 11 12 13 14 15 ^C
信号翻译地址:https://www.linux.org/threads/kill-signals-and-commands-revised.11625/
信号参考地址:https://www.cnblogs.com/guge-94/p/11016176.html
参考学习地址:https://www.jianshu.com/p/b26d4e520385(感谢大佬写的简述,通俗易懂,让后辈学习!)