在脚本中使用 Bash 信号捕获 | Linux 中国
文章插图
无论你的脚本是否成功运行 , 信号捕获(trap)都能让它平稳结束 。
? 来源:linux.cn ? 作者:Seth Kenlon ? 译者:Hank Chow ?
(本文字数:3879 , 阅读时长大约:4 分钟)
无论你的脚本是否成功运行 ,信号捕获(trap)都能让它平稳结束 。
Shell 脚本的启动并不难被检测到 , 但 Shell 脚本的终止检测却并不容易 , 因为我们无法确定脚本会按照预期地正常结束 , 还是由于意外的错误导致失败 。 当脚本执行失败时 , 将正在处理的内容记录下来是非常有用的做法 , 但有时候这样做起来并不方便 。 而 Bash 中 trap 命令的存在正是为了解决这个问题 , 它可以捕获到脚本的终止信号 , 并以某种预设的方式作出应对 。
响应失败如果出现了一个错误 , 可能导致发生一连串错误 。 下面示例脚本中 , 首先在 /tmp 中创建一个临时目录 , 这样可以在临时目录中执行解包、文件处理等操作 , 然后再以另一种压缩格式进行打包:
#!/usr/bin/env bashCWD=`pwd`TMP=${TMP:-/tmp/tmpdir}## create tmp dirmkdir "${TMP}"## extract files to tmptar xf "${1}" --directory "${TMP}"## move to tmpdir and run commandspushd "${TMP}"for IMG in *.jpg; domogrify -verbose -flip -flop "${IMG}"donetar --create --file "${1%.*}".tar *.jpg## move back to originpopd## bundle with bzip2bzip2 --compress "${TMP}"/"${1%.*}".tar \--stdout > "${1%.*}".tbz## clean up/usr/bin/rm -r /tmp/tmpdir
一般情况下 , 这个脚本都可以按照预期执行 。 但如果归档文件中的文件是 PNG 文件而不是期望的 JPEG 文件 , 脚本就会在中途失败 , 这时候另一个问题就出现了:最后一步删除临时目录的操作没有被正常执行 。 如果你手动把临时目录删掉 , 倒是不会造成什么影响 , 但是如果没有手动把临时目录删掉 , 在下一次执行这个脚本的时候 , 它必须处理一个现有的临时目录 , 里面充满了不可预知的剩余文件 。
其中一个解决方案是在脚本开头增加一个预防性删除逻辑用来处理这种情况 。 但这种做法显得有些暴力 , 而我们更应该从结构上解决这个问题 。 使用 trap 是一个优雅的方法 。
使用 trap 捕获信号我们可以通过 trap 捕捉程序运行时的信号 。 如果你使用过 kill 或者 killall 命令 , 那你就已经使用过名为 SIGTERM 的信号了 。 除此以外 , 还可以执行 trap -l 或 trap --list 命令列出其它更多的信号:
$ trap --list 1) SIGHUP2) SIGINT3) SIGQUIT4) SIGILL5) SIGTRAP 6) SIGABRT7) SIGBUS8) SIGFPE9) SIGKILL10) SIGUSR111) SIGSEGV12) SIGUSR213) SIGPIPE14) SIGALRM15) SIGTERM16) SIGSTKFLT17) SIGCHLD18) SIGCONT19) SIGSTOP20) SIGTSTP21) SIGTTIN22) SIGTTOU23) SIGURG24) SIGXCPU25) SIGXFSZ26) SIGVTALRM27) SIGPROF28) SIGWINCH29) SIGIO30) SIGPWR31) SIGSYS34) SIGRTMIN35) SIGRTMIN+136) SIGRTMIN+237) SIGRTMIN+338) SIGRTMIN+439) SIGRTMIN+540) SIGRTMIN+641) SIGRTMIN+742) SIGRTMIN+843) SIGRTMIN+944) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+1348) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-1253) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-956) SIGRTMAX-857) SIGRTMAX-758) SIGRTMAX-659) SIGRTMAX-560) SIGRTMAX-461) SIGRTMAX-362) SIGRTMAX-263) SIGRTMAX-164) SIGRTMAX
可以被 trap 识别的信号除了以上这些 , 还包括:
- EXIT:进程退出时发出的信号
- ERR:进程以非 0 状态码退出时发出的信号
- DEBUG:表示调试模式的布尔值
推荐阅读
- Biogen将使用Apple Watch研究老年痴呆症的早期症状
- Eyeware Beam使用iPhone追踪玩家在游戏中的眼睛运动
- 或使用天玑1000+芯片?荣耀V40已全渠道开启预约
- 苹果将推出使用mini LED屏的iPad Pro
- 手机能用多久?如果出现这3种征兆,说明“默认使用时间”已到
- 苹果有望在2021年初发布首款使用mini LED显示屏的 iPad Pro
- 笔记本保养有妙招!学会这几招笔记本再战三年
- 程序员开发抢茅台脚本:2天就刷榜Github
- 数据可视化三节课之二:可视化的使用
- 索尼sw77与sw55的使用差别感受