bash 陷阱不适用于 SIGTERM 或 SIGKILL

Ale*_*lls 0 bash pid kill bash-trap

我有这个:

  trap on_ql_trap EXIT;
  trap on_ql_trap INT;
  trap on_ql_trap TERM;
  echo "pid that called trap: $$"
Run Code Online (Sandbox Code Playgroud)

这可能可以变成速记:

  trap on_ql_trap EXIT INT TERM;
  echo "pid that called trap: $$"
Run Code Online (Sandbox Code Playgroud)

当我杀死调用陷阱的进程/pid 时,使用

kill <pid>
Run Code Online (Sandbox Code Playgroud)

或者

kill -9 <pid>
Run Code Online (Sandbox Code Playgroud)

在第一种情况下,什么也不会发生。这个过程继续存在。在使用 -9 的第二种情况下,进程终止,但不会调用陷阱。所以这两个 kill 命令都没有做我想要的!我希望进程退出,但我需要先调用陷阱。有谁知道为什么会这样?

Dav*_*ica 5

正如您所发现的,有两个信号无法被捕获、阻止或忽略。他们是SIGKILLSIGSTOP。描述限制的参考文献是man 7 signal。它用明确的术语说明了这一点:

The signals SIGKILL and SIGSTOP cannot be caught, blocked, or
ignored.
Run Code Online (Sandbox Code Playgroud)

该限制适用于 bashtrap内置。