前言

  当我们在运行某一段代码的时候,希望有类似事物一样的操作,要么成功,要么失败;一般的shell脚本都是自上而下,从左之后运行,碰到异常信号就会出错,从而终止脚本的运行,这个时候脚本可能运行到某一处数据写入操作的时候,强迫停止,从而造成重大失误,trap可能帮助我们尽量减少这个问题,记住是尽量减少,不等于全部避免。

trap

  允许你监听指定的信号,并对相应的信号做出对应的反应;

格式

trap commands signals
注意:这里的commands就是在捕获signals信号之后做出的相应反应;捕获信号可以用来做防御操作,也可以用来做进攻操作。

选项

-l     列出trap的相关信号

Linux信号大全

 ) SIGHUP       ) SIGINT       ) SIGQUIT      ) SIGILL
) SIGTRAP ) SIGABRT ) SIGBUS ) SIGFPE
) SIGKILL ) SIGUSR1 ) SIGSEGV ) SIGUSR2
) SIGPIPE ) SIGALRM ) SIGTERM ) SIGSTKFLT
) SIGCHLD ) SIGCONT ) SIGSTOP ) SIGTSTP
) SIGTTIN ) SIGTTOU ) SIGURG ) SIGXCPU
) SIGXFSZ ) SIGVTALRM ) SIGPROF ) SIGWINCH
) SIGIO ) SIGPWR ) SIGSYS ) SIGRTMIN
) SIGRTMIN+ ) SIGRTMIN+ ) SIGRTMIN+ ) SIGRTMIN+
) SIGRTMIN+ ) SIGRTMIN+ ) SIGRTMIN+ ) SIGRTMIN+
) SIGRTMIN+ ) SIGRTMIN+ ) SIGRTMIN+ ) SIGRTMIN+
) SIGRTMIN+ ) SIGRTMIN+ ) SIGRTMIN+ ) SIGRTMAX-
) SIGRTMAX- ) SIGRTMAX- ) SIGRTMAX- ) SIGRTMAX-
) SIGRTMAX- ) SIGRTMAX- ) SIGRTMAX- ) SIGRTMAX-
) SIGRTMAX- ) SIGRTMAX- ) SIGRTMAX- ) SIGRTMAX-
) SIGRTMAX- ) 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=
while [ $count -le ]
do
echo "Loop $count"
sleep
count=$[ $count + ]
done echo The end.

运行结果

This is a test script
Loop
Loop
^CSorry! I have trapped Ctrl-C
Loop
Loop
^CSorry! I have trapped Ctrl-C
Loop
Loop
Loop
Loop
^CSorry! I have trapped Ctrl-C
Loop
Loop
The end.

示例2

#!/bin/bash
# 除了在shell脚本中捕获信号外,也可以在shell退出时捕获,在trap命令后加上EXIT信号就行。
# test trap command
trap "echo Goodbye." EXIT echo This is a test script count=
while [ $count -le ]
do
echo "Loop $count"
sleep
count=$[ $count + ]
done echo The end.

运行结果

This is a test script
Loop
Loop
Loop
Loop
Loop
Loop
Loop
Loop
Loop
Loop
The end.
Goodbye.

示例3

#!/bin/bash
# 修改trap操作
# test trap command trap "echo 'Sorry! I have trapped Ctrl-C'" SIGINT count=
while [ $count -le ]
do
echo "Loop $count"
sleep
count=$[ $count + ]
done trap "echo 'Sorry! The trap has been modified.'" SIGINT count=
while [ $count -le ]
do
echo "Loop $count"
sleep
count=$[ $count + ]
done echo The end.

运行结果:

Loop
Loop
Loop
^CSorry! I have trapped Ctrl-C
Loop
Loop
Loop
Loop
Loop
^CSorry! The trap has been modified.
Loop
Loop
The end.

示例4

#!/bin/bash
trap "echo 'Sorry! This is FOR!'" SIGINT
for ((i=; i<=; i++))
do
echo "$i"
sleep 0.1
done trap -- SIGINT for ((i=; i<=; i++))
do
echo "$i"
sleep 0.1
done

运行结果:


^CSorry! This is FOR!

^CSorry! This is FOR!

^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(感谢大佬写的简述,通俗易懂,让后辈学习!)

最新文章

  1. json根据key取values
  2. Ubuntu中启用关闭Network-manager网络设置问题!
  3. 项目管理软件之易度1.5,禅道2.0,redmine1.2(附redmine1.2的安装)
  4. IOS开发之—— iOS 支付 [支付宝、银联、微信]
  5. quick lua目录结构
  6. 编译小结(6)认识Automake
  7. Invoke BeginInvoke
  8. [LeetCode#261] Graph Valid Tree
  9. 使用Bootstrap + Vue.js实现 添加删除数据
  10. sql执行时间过长,请高手指点!
  11. python3中json模块的用法
  12. 什么是tomcat集群?
  13. CAST()函数可以进行数据类型的转换。
  14. JSP&#183;随笔
  15. SQLNET.AUTHENTICATION_SERVICES操作系统认证登录的设定
  16. 使用Guava的RateLimiter完成简单的大流量限流
  17. SqlServer根据表中ID加序号
  18. PHP-SESSION深入理解
  19. Qt编写密钥生成器+使用demo(开源)
  20. MVC 扩展RadioButtonListFor和CheckBoxListFor

热门文章

  1. $51nod\ 1522$ 上下序列 $dp$
  2. 洛谷$P2168\ [NOI2015]$荷马史诗 贪心
  3. HelloTalk 基于 OpenResty 的全球化探索之路
  4. Flutter中Expanded组件用法
  5. c++数字和字符之间的转化
  6. 端口扫描器--利用python的nmap模块
  7. JAVA读取yml配置文件指定key下的所有内容
  8. Vim区块选择
  9. 使用SqlDependency实时监听SQL server数据库变化并执行事件
  10. .Net Core Web Api实践(三).net core+Redis+docker实现Session共享