Есть ли способ сказать, был ли сценарий оболочки убит с сигналом 9


14

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

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


4
Что запускает скрипт оболочки? Этот процесс должен иметь доступ к statusдочернему процессу через wait(2)что-либо.
августа

Java-программа, которая работает как демон, запущенный с помощью upstart, выполняет процесс сценария оболочки
jgr208

1
Вы можете запустить программу и найти строку с надписью «убит SIGKILL» или выполнить какую-нибудь аудиторскую работу-a entry,always -F arch=b64 -S kill -k kill_signals
Братчли

Ответы:


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, kill -9 не может быть пойман в ловушку
c4f4t0r

Есть ли у вас источники?
Двадцать
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.