bash trap 会从键盘 Ctrl-C 回显而不是 kill 2
bash trap will echo from keyboard Ctrl-C while not kill 2
假设我有一个脚本:
#!/bin/bash
# test_trap.sh
trap "echo SIGINT captured!" SIGINT
echo $$
sleep 1000
我知道 trap COMMAND 只会在 sleep 1000
收到 SIGINT 信号后执行。但是当我按下键盘 Ctrl-C:
时,陷阱命令将被执行
> sh test_sh.sh
50138
^CSIGINT captured!
而使用 kill -s SIGINT 则不会。
我在这里错过了什么?
bash 版本是 GNU bash, 4.2.46(2)-release
使用 kill -s SIGINT 50138
,您 仅 将信号发送到 shell 的进程,并且必须等待 sleep 1000
结束,因为sleep
没有收到信号。
但是,Control-C 会导致终端向当前进程组中的每个进程发送 SIGINT
,因此您的 shell 脚本 和 sleep
收到。在 sleep
完成之前,您的脚本仍然不会处理陷阱命令,但是 sleep
会立即退出以响应刚刚从终端收到的 SIGINT
。
如果你的kill
支持,你也可以使用kill -s SIGINT -50138
(注意负进程id)向整个进程组发送SIGINT。
假设我有一个脚本:
#!/bin/bash
# test_trap.sh
trap "echo SIGINT captured!" SIGINT
echo $$
sleep 1000
我知道 trap COMMAND 只会在 sleep 1000
收到 SIGINT 信号后执行。但是当我按下键盘 Ctrl-C:
> sh test_sh.sh
50138
^CSIGINT captured!
而使用 kill -s SIGINT 则不会。
我在这里错过了什么?
bash 版本是 GNU bash, 4.2.46(2)-release
使用 kill -s SIGINT 50138
,您 仅 将信号发送到 shell 的进程,并且必须等待 sleep 1000
结束,因为sleep
没有收到信号。
Control-C 会导致终端向当前进程组中的每个进程发送 SIGINT
,因此您的 shell 脚本 和 sleep
收到。在 sleep
完成之前,您的脚本仍然不会处理陷阱命令,但是 sleep
会立即退出以响应刚刚从终端收到的 SIGINT
。
如果你的kill
支持,你也可以使用kill -s SIGINT -50138
(注意负进程id)向整个进程组发送SIGINT。