Sui sistemi POSIX, i segnali di terminazione di solito hanno il seguente ordine (in base a molte pagine MAN e alle specifiche POSIX):
SIGTERM: chiedi cortesemente di terminare un processo. Terminerà correttamente, ripulendo tutte le risorse (file, socket, processi figli, ecc.), Eliminando i file temporanei e così via.
SIGQUIT - richiesta più forte. Terminerà sgradevole, ripulendo ancora le risorse che hanno assolutamente bisogno di essere ripulite, ma forse non cancellerà i file temporanei, forse scriverà le informazioni di debug da qualche parte; su alcuni sistemi verrà scritto anche un core dump (indipendentemente dal fatto che il segnale venga catturato dall'app o meno).
SIGKILL - richiesta più forte. Al processo non viene nemmeno chiesto di fare nulla, ma il sistema ripulirà il processo, che sia così o meno. Molto probabilmente viene scritto un core dump.
Come si inserisce SIGINT in quell'immagine? Un processo CLI viene solitamente terminato da SIGINT quando l'utente preme CRTL + C, tuttavia un processo in background può anche essere terminato da SIGINT utilizzando l'utility KILL. Quello che non riesco a vedere nelle specifiche o nei file di intestazione è se SIGINT è più o meno forte di SIGTERM o se c'è qualche differenza tra SIGINT e SIGTERM.
AGGIORNARE:
La migliore descrizione dei segnali di terminazione che ho trovato finora è nella documentazione GNU LibC . Spiega molto bene che c'è una differenza intenzionale tra SIGTERM e SIGQUIT.
Dice di SIGTERM:
È il modo normale per chiedere cortesemente di terminare un programma.
E dice di SIGQUIT:
[...] e produce un core dump quando termina il processo, proprio come un segnale di errore del programma. Si può pensare a questa come una condizione di errore del programma "rilevata" dall'utente. [...] Alcuni tipi di pulizie sono meglio omessi nella gestione di SIGQUIT. Ad esempio, se il programma crea file temporanei, dovrebbe gestire le altre richieste di terminazione eliminando i file temporanei. Ma è meglio che SIGQUIT non li elimini, in modo che l'utente possa esaminarli insieme al core dump.
E anche SIGHUP è spiegato abbastanza bene. SIGHUP non è realmente un segnale di terminazione, significa semplicemente che la "connessione" con l'utente è stata persa, quindi l'app non può aspettarsi che l'utente legga ulteriori output (es. Stdout / stderr output) e non ci sono input da aspettarsi dal utente più a lungo. Per la maggior parte delle app, ciò significa che è meglio chiudere. In teoria un'app potrebbe anche decidere di entrare in modalità daemon quando viene ricevuto un SIGHUP e ora viene eseguita come processo in background, scrivendo l'output in un file di registro configurato. Per la maggior parte dei demoni già in esecuzione in background, SIGHUP di solito significa che devono riesaminare i propri file di configurazione, quindi lo si invia ai processi in background dopo aver modificato i file di configurazione.
Tuttavia non c'è alcuna spiegazione utile di SIGINT in questa pagina, a parte quella che viene inviata da CRTL + C. C'è qualche motivo per gestire SIGINT in un modo diverso da SIGTERM? In caso affermativo, quale sarebbe questo motivo e come sarebbe diverso il trattamento?
sudo fuser -l
sul prompt dei comandi. Per me questo fa apparire:HUP INT QUIT ILL TRAP ABRT IOT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH IO PWR SYS UNUSED
kill -l
per un elenco di segnali.