Чи є спосіб сказати, чи скрипт оболонки був убитий сигналом 9


14

У мене є сценарій bash (викликається з програми java), який постійно вбивається. Я завжди зловити signal 15з , trapале тоді який -небудь інший сигнал приходить, що я підозрюю, signal 9але я в основному засліпити, щоб , якщо це дійсно signal 9.

Я знаю, що ти не можеш trap signal 9, тож чи є інший спосіб, який я можу сказати, чи signal 9вбиває мене скрипт оболонки?


4
Що запускає скрипт оболонки? Цей процес повинен мати доступ до statusдочірнього процесу через wait(2)щось подібне.
триг

програма java, яка працює як демон, розпочатий з запуску, запускає процес сценарію оболонки
jgr208

1
Ви можете напружити програму і шукати рядок, на якому написано "вбитий SIGKILL" або виконати якусь аудиторську роботу-a entry,always -F arch=b64 -S kill -k kill_signals
Bratchley

Відповіді:


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

EDIT: Зауважте, що програма може вирішити вихід з будь-яким значенням (тому ви повинні вирішити, наскільки ви довіряєте статусу виходу, щоб бути ефектом сигналу):

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

Примітка 1: У моїх системах коди виходу представлені у вигляді ненаписаних 8-бітних чисел, тому вони завершуються на 256 = 0.


1
Зверніть увагу, що це надійно лише для сигналу 9, який не може бути захоплений. Інші сигнали можуть бути захоплені програмою, яка потім може вийти з будь-яким значенням.
GnP

так, як повідомив gnp, вбивство -9 не може бути в
пастці

У вас є джерела?
Двадцять
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.