GNU/Linux >> Linux Esercitazione >  >> Linux

Quando il sistema invia un SIGTERM a un processo?

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.


Linux
  1. Nuovo processo genitore quando il processo genitore muore?

  2. In che modo Unix tiene traccia della directory di lavoro di un utente durante la navigazione nel file system?

  3. Cosa significa nell'output di Ps?

  4. Cosa significa &alla fine di un comando Linux?

  5. Come posso eliminare un utente in Linux quando il sistema dice che è attualmente utilizzato in un processo

SIGTERM vs SIGKILL:qual è la differenza?

Come inviare processi in background su Linux

Qual è la tabella dei processi Linux? In cosa consiste?

Perché popen() invoca una shell per eseguire un processo?

Perché il fork del mio processo fa sì che il file venga letto all'infinito

Cosa succede quando si invia SIGKILL a un processo Zombie in Linux?