有没有办法判断 shell 脚本是否被信号 9 杀死

有没有办法判断 shell 脚本是否被信号 9 杀死

我有一个 bash 脚本(从 java 程序调用)不断被杀死。我总是捕捉到signal 15trap但随后出现一些其他信号,我怀疑是,signal 9但我基本上不知道它是否真的signal 9

我知道你不能trap signal 9,那么还有其他方法可以判断是否signal 9正在杀死我的 shell 脚本吗?

答案1

被杀死的命令的退出状态应该是信号号加128。因此您可以使用退出状态来找出哪个信号杀死了您的进程。

我在 Linux 的 shell 中进行了这样的测试:

print_exit_status_for_signal () {
  (
    sleep 1000
    echo Exit staus $? = signal $(( $? - 128 ))
  ) &
  sleep 1
  killall "${1:+-$1}" sleep
}
print_exit_status_for_signal
print_exit_status_for_signal 15
print_exit_status_for_signal 9
print_exit_status_for_signal KILL
print_exit_status_for_signal TERM

编辑:请注意,程序可以决定以任何 1 值退出(因此您必须决定您在多大程度上相信退出状态是信号的影响):

for i in $(seq 256); do
  sh -c "exit $i"
  echo Program exited with $?
done

脚注 1:在我的系统上,退出代码表示为无符号 8 位数字,因此它们在 256=0 处换行。

相关内容