1. 信号:那些被异步发送到一个程序的事件
# trap -l
1) SIGHUP 终止进程,终端线路挂断
2) SIGINT 终止进程,中断进程(Ctrl-C)
3) SIGQUIT 终止进程,产生core文件(Ctrl-)
4) SIGILL 非法指令
9) SIGKILL 终止进程,杀死进程
15) SIGTERM 终止进程,软件终止信号
18) SIGCONT 忽略信号,继续执行一个停止的进程
19) SIGSTOP 停止进程,非终端来的停止信号
20) SIGTSTP 停止进程,终端来的停止信号
# 无法被忽略的信号
KILL(9)
STOP(17)
CONT(19)
# 可被捕获的信号
HUP(1)
INT (2, Ctrl-c)
QUIT (3, Ctrl-)
TERM (15)
2. trap 捕获信号,三种处理方式
1) 执行一段程序来处理这个信号
trap ‘cmds’ signals
2) 接受信号的默认操作
trap signals
3) 忽略信号
trap ’ ’ signals
# Ctrl-C/Ctrl-\ 打印提示并退出
trap 'echo "you hit Ctrl-C/Ctrl-\, now exiting.."; exit' SIGINT SIGQUIT
# 使Ctrl-C无效
stty -a # 获取中断信号与键盘的对应关系
trap "" 2
tail -f /etc/passwd # Ctrl+C can't quit
trap 2
tail -f /etc/passwd # Normal
3. trap处理shell返回值
1) 脚本正常退出后,执行指定命令
trap “cmds” EXIT
2) 脚本执行时打印调试信息
trap “cmds” DEBUG
3) 当命令出错,退出码非0,执行指定的命令
trap “cmds” ERR
4) 从shell函数返回,或source另一个脚本文件时,执行指定的命令
trap “cmds” RETURN
# 追踪命令或函数的返回状态
trap 'echo "[LINE:$LINENO] Error: Command or function exited with status $?"' ERR
# 追踪命令执行后的详细结果
trap 'echo "Before execute line $LINENO: a=$a, b=$b, c=$c"' DEBUG