Есть ли способ узнать, был ли завершен скрипт оболочки с помощью сигнала 9?

Есть ли способ узнать, был ли завершен скрипт оболочки с помощью сигнала 9?

У меня есть скрипт bash (вызванный из программы java), который постоянно убивается. Я всегда ловлю signal 15with trap, но затем приходит какой-то другой сигнал, который я подозреваю, signal 9но я практически слеп, если это действительно signal 9.

Я знаю, что вы не можете этого сделать trap signal 9, но есть ли другой способ узнать, signal 9убивает ли он мой скрипт оболочки?

решение1

Статус выхода завершенной команды должен быть равен номеру сигнала плюс 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

EDIT: Обратите внимание, что программа может принять решение о выходе с любым¹ значением (поэтому вам нужно решить, насколько вы доверяете статусу выхода результату сигнала):

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

Сноска 1: В моих системах коды выхода представлены в виде беззнаковых 8-битных чисел, поэтому они возвращаются к значению 256=0.

Связанный контент