今天写脚本的时候遇到一个trap不会立即触发的问题。
============bbb.sh======
#!/bin/bash
# traptest.sh
trap "echoBooh!;exit 0" TERM
trap "echo Booh!;exit 0" INT
echo "pid is$$"
sleep 600
===============
运行脚本,执行echo后进入睡眠。此时用ps -xj看bbb.sh和sleep 600在同一个进程组TPGID。
重新登入一个登录shell,向该bbb.sh发送INT新号:kill -INT PID或者发送kill -TERM PID,
这时bbb.sh会捕捉到这个新号,但是不会立即执行trap表中的程序(echo Booh!;exit 0),而是等到sleep 600这个子进程结束之后才会执行echo Booh!;exit 0。
经初步验证,除了不能被捕捉的两个新号-9和-19信号外,每当Bash收到一个预先设置等待命令完成的陷阱的信号,在所有的子进程或者子shell退出之前,trap设置的命令不会被执行到。
还有另外,当执行bbb.sh在终端运行时,按CTRL+Ctrap会立即触发,bbb.sh结束。
最终的原因是:CTRL+C会向当前前台进程组所有进程(子进程和父进程)都发送一个INT新号。Sleep 600在收到INT新号之后退出,这是bbb.sh捕捉到的INT信号就会触发了。
本文探讨了Bash脚本中Trap机制的行为特征,特别是当接收到信号时不会立即触发预设动作的情况。通过示例bbb.sh展示了在不同场景下(如通过kill命令发送信号与直接键盘中断)Trap的响应差异。
8295

被折叠的 条评论
为什么被折叠?



