Quando il sistema invia un SIGTERM a un processo?

Il mio programma server ha ricevuto un SIGTERM e si è fermato (con codice di uscita 0). Sono sorpreso da questo, poiché sono abbastanza sicuro che ci fosse un sacco di memoria per questo. In quali condizioni linux (busybox) invia un SIGTERM a un processo?

Commenti

  • Posso ' t pensare a qualsiasi caso in cui il kernel o uno strumento standard invierebbe SIGTERM a un processo casuale. Cosa puoi dirci su cosa sta facendo il programma e come ' è stato avviato? Come hai scoperto lo stato di uscita del programma '? Puoi riprodurre il problema? Hai dei log che puoi controllare?
  • Sta leggendo e scrivendo su una linea seriale e sta rispondendo alle richieste UDP e TCP. Ho avvolto lesecuzione su uno script bash e quindi conosco il codice di uscita.
  • La documentazione di Posix indica che SIGTERM è strettamente un evento a livello di utente. È possibile che qualcun altro sia riuscito a uccidere il tuo programma server?
  • Lo sei! Il codice di ritorno 0 indica unuscita normale. Se ci fosse un SIGTERM, $? verrebbe impostato su 143 (128 + numero di segnale).
  • Inoltre, ^ C è SIGINT, non SIGTERM, e questo sarebbe esci con un codice 130.

Risposta

Lo pubblicherò come risposta quindi che esiste un qualche tipo di soluzione se questo risulta essere il problema.

Uno stato di uscita pari a 0 significa una normale uscita da un programma di successo. Un programma in uscita può scegliere qualsiasi numero intero compreso tra 0 e 255 come stato di uscita. Convenzionalmente, i programmi utilizzano valori piccoli. I valori 126 e superiori sono usati dalla shell per segnalare condizioni speciali, quindi è meglio evitarle.

A livello di API C, i programmi riportano uno stato a 16 bit¹ che codifica sia lo stato di uscita del programma che il segnale che lo ha ucciso, se presente.

Nella shell, un command “s exit status (salvato in $?) combina lo stato di uscita effettivo del programma e il valore del segnale: se un programma viene interrotto da un segnale, $? è impostato su un valore maggiore di 128 (con la maggior parte delle shell, questo valore è 128 più il numero di segnale; ATT ksh usa 256 + numero di segnale e yash usa 384 + numero di segnale, che evita lambiguità, ma le altre shell non hanno “t seguito lesempio).

In particolare, se $? è 0, il tuo programma è uscito normalmente.

Notare che questo include il caso di un processo che riceve SIGTERM, ma ha un gestore di segnale per esso, e alla fine esce normalmente (forse come una conseguenza indiretta del segnale SIGTERM, forse no).


Per rispondere alla domanda nel titolo, SIGTERM non viene mai inviato automaticamente dal sistema. Ci sono alcuni segnali che vengono inviati automaticamente come SIGHUP quando un terminale va via, SIGSEGV / SIGBUS / SIGILL quando un processo fa cose che non dovrebbe fare, SIGPIPE quando scrive su un tubo / socket rotto, ecc. alcuni segnali inviati a causa della pressione di un tasto in un terminale, principalmente SIGINT per Ctrl + C , SIGQUIT per Ctrl + \ e SIGTSTP per Ctrl + Z , ma SIGTERM non è uno di quelli. Se un processo riceve SIGTERM, un altro processo ha inviato quel segnale.

¹ approssimativamente

Commenti

  • Bella spiegazione di come lo stato di uscita viene determinato alla ricezione di un segnale. Tuttavia, questa risposta non ' t indirizzo OP ' s domanda.
  • @codeforester Ho risposto alla domanda nel body, non la domanda nel titolo. Beh, una delle domande nel corpo – dato che era basata su un malinteso, è un po confusa. I ' aggiungerò alcune parole sul resto.
  • Dipende dalla shell. In ksh93, è ' 256 + signum, in yash, è ' è 384 + signum
  • Nota che utilizzare un valore superiore a 256 a la ksh non è necessariamente migliore in quanto ciò impedisce che venga passato a exit. Lapproccio yash è un buon compromesso, ma vedi rc per un altro. Vedi anche Codice di uscita predefinito al termine del processo?

Risposta

SIGTERM è il segnale che è tipicamente usato per terminare amministrativamente un processo.

Non è un segnale che il kernel invierebbe, ma questo è il segnale che un processo tipicamente invia per terminare (con grazia) un altro processo.

Questo è il segnale inviato per impostazione predefinita da kill, pkill, killall … comandi.

Questo è il segnale che viene inviato ai daemon per fermarli (come su un service some-service stop) o inviato da init prima dellarresto (seguito da SIGKILL per quei processi che non sono riusciti a terminare in tempo su SIGTERM).

Nota che SIGTERM non è il segnale inviato su ^C. Il segnale inviato su ^C è SIGINT.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *