Pubblicherò questo come risposta in modo che ci sia una sorta di soluzione se questo risulta essere il problema.
Uno stato di uscita pari a 0 indica un'uscita normale da un programma riuscito. Un programma in uscita può scegliere qualsiasi numero intero compreso tra 0 e 255 come suo stato di uscita. Convenzionalmente, i programmi usano valori piccoli. I valori 126 e superiori sono usati dalla shell per segnalare condizioni speciali, quindi è meglio evitarli.
A livello di API C, i programmi segnalano uno stato¹ a 16 bit che codifica sia lo stato di uscita del programma sia il segnale che lo ha ucciso, se presente.
Nella shell, lo stato di uscita di un comando (salvato in $?
) unisce l'effettivo stato di uscita 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 del segnale; ATT ksh usa 256 + numero del segnale e yash usa 384 + numero del segnale, che evita l'ambiguità, ma le altre shell non hanno seguito completo).
In particolare, se $?
è 0, il tuo programma è terminato normalmente.
Nota 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 conseguenza indiretta del segnale SIGTERM, forse no).
Per rispondere alla domanda nel tuo 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 pipe/socket rotto, ecc. E ci sono alcuni segnali che vengono 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, qualche altro processo ha inviato quel segnale.
¹ in parole povere
SIGTERM è il segnale tipicamente utilizzato per terminare amministrativamente un processo.
Non è un segnale che il kernel invierebbe, ma è il segnale che un processo in genere invierebbe per terminare (graziosamente) un altro processo.
Questo è il segnale inviato di default dal kill
, pkill
, killall
... comandi.
Questo è il segnale che viene inviato ai demoni per fermarli (come su un service some-service stop
), o inviato da init
prima dello spegnimento (seguito da SIGKILL per quei processi che non sono riusciti a terminare in tempo su SIGTERM).
Nota che SIGTERM non è il segnale che viene inviato su ^C
. Il segnale inviato su ^C
è SIGINT.