有什么办法可以判断一个shell脚本是否被信号9杀死了


14

我有一个bash脚本(从Java程序调用),该脚本一直被杀死。我总是跟上signal 15trap但是随后出现了一些其他信号,我怀疑是,signal 9但对于真的是基本上是盲目的signal 9

我知道你做不到trap signal 9,所以还有别的方法可以告诉我是否signal 9正在杀死我的shell脚本?


4
什么正在运行shell脚本?该进程应该可以status通过wait(2)或其他方式访问子进程的。
thrig

以upstart形式启动的作为守护程序运行的Java程序正在运行Shell脚本进程
jgr208,2016年

1
您可以跟踪该程序,并寻找一条说“被SIGKILL杀死”的行,或者与-a entry,always -F arch=b64 -S kill -k kill_signals
Bratchley

Answers:


20

被杀死的命令的退出状态应该是信号号加128。因此,您可以使用退出状态来找出要处理的被杀死的信号。

我在Linux的外壳中像这样测试了它:

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

编辑:请注意,程序可以决定以任何¹值退出(因此,您必须确定您对退出状态能产生信号影响的信任程度):

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

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


1
请注意,这仅对无法捕获的信号9可靠。程序可以捕获其他信号,然后以任何值退出。
GnP

是的,正如gnp所说,杀戮-9无法被捕获
c4f4t0r

你有资料吗?
Twifty
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.