C'è un modo per dire se uno script di shell è stato ucciso con il segnale 9


14

Ho uno script bash (chiamato da un programma Java) che continua a essere ucciso. Ho sempre prendo il signal 15con trapma poi qualche altro segnale arriva che ho il sospetto è signal 9, ma sono in fondo cieco da se è veramente signal 9.

So che non puoi trap signal 9, quindi c'è un altro modo in cui posso dire se signal 9sta uccidendo il mio script shell?


4
Cosa sta eseguendo lo script della shell? Tale processo dovrebbe avere accesso al statusprocesso figlio tramite wait(2)o qualcosa del genere.
thrig

un programma java in esecuzione come daemon avviato con upstart esegue il processo di script shell
jgr208

1
Potresti definire il programma e cercare una riga che dice "ucciso da SIGKILL" o fare un po 'di lavoro di auditd con-a entry,always -F arch=b64 -S kill -k kill_signals
Bratchley,

Risposte:


20

Lo stato di uscita di un comando ucciso dovrebbe essere il numero del segnale più 128. Quindi puoi usare lo stato di uscita per scoprire quale segnale ha ucciso il tuo processo.

L'ho provato in questo modo su Linux nella shell:

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: Nota che un programma può decidere di uscire con qualsiasi valore¹ (quindi devi decidere fino a che punto credi che lo stato di uscita sia l'effetto di un segnale):

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

Nota a piè di pagina 1: sui miei sistemi i codici di uscita sono rappresentati come numeri a 8 bit non firmati, quindi vanno a 256 = 0.


1
Si noti che ciò è affidabile solo per il segnale 9 che non può essere intrappolato. Altri segnali possono essere intrappolati dal programma che può quindi uscire con qualsiasi valore.
GnP,

si, come ha detto gnp, l'uccisione -9 non può essere intrappolata
c4f4t0r

Hai qualche fonte?
1818
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.