我有一个 bash 脚本(从 java 程序调用)不断被杀死。我总是捕捉到signal 15
,trap
但随后出现一些其他信号,我怀疑是,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 处换行。