
У меня есть скрипт bash (вызванный из программы java), который постоянно убивается. Я всегда ловлю signal 15
with 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.