bash脚本中捕捉信号
当脚本遇到错误或被用户终止时,有些清理动作需要执行,这时候可以通过捕捉signal来完成这项工作.
trap格式为:
1 | trap commands signals |
commands可以是任何内建命令,外部命令或者脚本中的函数等.
signals是要捕捉的信号,可以一次扑捉多个信号,只要提供信号列表即可.
系统支持的信号列表:
1 | $ kill -l |
trap不只可以捕获各种信号,还可以捕获EXIT和ERR。
trap func EXIT允许在脚本结束时调用注册的函数。由于无论正常退出抑或异常退出,因此是写脚本清理函数绝佳所在。
trap func ERR允许在运行出错时调用注册的函数。不过要记住,程序异常退出时,既会调用EXIT注册的函数,也会调用ERR注册的函数。
如果脚本中设置了:
1 | set -e |
当脚本中任何命令退出码非0时,立即退出脚本,这时候可以扑捉ERR,并设置处理程序:
1 | trap 'err_handler ${LINENO} $?' ERR |
通过捕捉ERR,可以捕捉到程序非正常退出包括SIGINT(Ctrl+C)
${LINENO}为出错的行号,$?为最后执行命令的退出码
References:
[1]关于Linux Shell的信号trap功能你必须知道的细节
[2]12.2. Traps
[3]编写可靠shell脚本的八个建议
===
[erq]