Czy jest jakiś sposób, aby stwierdzić, czy skrypt powłoki został zabity sygnałem 9


14

Mam skrypt bash (wywoływany z programu Java), który ciągle ginie. Zawsze łapię signal 15za, trapale wtedy pojawia się jakiś inny sygnał, który, jak podejrzewam, jest signal 9w zasadzie ślepy, czy tak naprawdę jest signal 9.

Wiem, że nie możesz trap signal 9, więc czy jest jakiś inny sposób, aby stwierdzić, czy signal 9zabija mój skrypt powłoki?


4
Co uruchamia skrypt powłoki? Proces ten powinien mieć dostęp do statusprocesu potomnego za pośrednictwem wait(2)lub coś takiego.
thrig

program Java, który działa jako demon uruchomiony przy uruchomieniu, uruchamia proces skryptu powłoki
jgr208

1
Możesz prześledzić program i poszukać wiersza z napisem „zabity przez SIGKILLA” lub wykonać jakąś kontrolowaną pracę z-a entry,always -F arch=b64 -S kill -k kill_signals
Bratchley

Odpowiedzi:


20

Status wyjścia zabitego polecenia powinien być numerem sygnału plus 128. Możesz więc użyć statusu wyjścia, aby dowiedzieć się, który sygnał został zabity przez ciebie.

Testowałem to tak na Linuksie w powłoce:

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

EDYCJA: Zauważ, że program może zdecydować o zakończeniu z dowolną wartością¹ (więc musisz zdecydować, na ile ufasz statusowi wyjścia, aby był efektem sygnału):

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

Przypis 1: W moich systemach kody wyjścia są reprezentowane jako 8-bitowe liczby bez znaku, więc zawijają się przy 256 = 0.


1
Zauważ, że jest to wiarygodne tylko dla sygnału 9, którego nie można uwięzić. Inne sygnały mogą zostać zatrzymane przez program, który może następnie wyjść z dowolną wartością.
GnP

tak, jak powiedział Gnp, zabicie -9 nie może zostać uwięzione
c4f4t0r

Czy masz jakieś źródła?
Twifty
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.