Какой сигнал (SIGTERM
, SIGINT
,...) поднимает JVM во время необработанного исключения?
Например, исключением может быть java.lang.NumberFormatException
.
Необработанные исключения не обязательно заставляют JVM поднять сигнал - это не обязательно: исключение попадает в системный код Java и обрабатывается там (печатает трассировку стека и, например, выходы).
Могут быть случаи, когда JVM поднимают сигнал, чтобы вызвать обработчик сигнала для записи дополнительной диагностической информации.
С другой стороны, Oracle JVM (например) устанавливает обработчики сигналов, чтобы уловить некоторые конкретные ошибки и преобразовать их в исключения - подробнее см. Здесь.
EDIT, чтобы следить за комментариями выше, и на основе ссылки на источник (хотя вы не показываете сценарий, который вызывает неудачную программу Java AFAICT):
Ловушки, которые вы установили, заставляют интерпретатор оболочки устанавливать обработчики сигналов, если он получает SIGINT/... Они не вызывают, если дочерний процесс получает такой сигнал (повышение приводит к тому, что рассматриваемый процесс получает сигнал - чтобы сигнализировать другой процесс, который вам нужен, чтобы убить и друзей).
Поэтому, даже если JVM должен был поднять сигнал, оболочка не получит его.
Что может произойти в вашем случае, так это то, что bash настроен на выход с ошибкой (например, set -o errexit), и поэтому код освобождения блокировки не запускается просто потому, что код выхода JVM не равен null из-за необработанного исключения.
Чтобы исправить это, добавьте ERR (и, возможно, EXIT) в signal_spec вашего вызова ловушки.