Come funzionano i segnali Linux: SIGINT, SIGTERM e SIGKILL

Contenuti

simbolo di pericolo

Gli interrupt software sui sistemi Linux e Unix vengono eseguiti tramite segnali. Ci sono molti diversi segnali Linux, ma alcuni sono evidenziati ed è fondamentale capirli e conoscerli: SIGINT, SIGTERM e SIGKILL. Ecco come funzionano.

Che cos'è un? Segnale Linux?

Capiamo tutti che un semaforo rosso significa che dobbiamo smettere di camminare o guidare. Equivalentemente, su sistemi Linux e Unix, un segnale può essere passato a un programma o servizio in esecuzione per interagire con esso. Come esempio, si potrebbe inviare un segnale a semaforo rosso a un programma semplicemente trasmettendo a SIGTERM cartello.

Proprio come con una luce rossa, le persone possono scegliere di continuare a camminare o guidare quando il semaforo è rosso. Anche se potrebbe non essere un'idea sicura per tutti i soggetti coinvolti, un SIGTERM segnalare una procedura farà esattamente questo; La procedura / il programma può scegliere di ignorare detto segnale.

Tutti i segnali di base di Linux hanno un numero (1-30 +). Dopo un po, un utente Linux generalmente esperto conoscerà uno o più di questi. Come esempio, il SIGTERM il segnale corrisponde al numero 15 e il segnale 9 (SIGKILL) è probabilmente il più noto, poiché consente di chiudere forzatamente una procedura, a differenza del nostro SIGTERM esempio a luci rosse.

htop mostra i possibili segnali del programma

Qui vediamo la schermata principale di htop (puoi installare questa pratica utility digitando sudo apt install htop in Ubuntu / menta, oh sudo yum install htop in RedHat / Centos / Fedora) con una serie di segnali di terminazione e altro (più in basso nella lista; ci sono 37 totale) che può essere inviato a una procedura precedentemente selezionata sulla destra. Si può scegliere una procedura premendo il cursore su / verso il basso e quindi inviare un segnale utilizzando F9.

SIGKILL & SIGTERM

Anche se il nome può sembrare un po' sinistro, il gergo comune di Linux per la terminazione del processo è quello “il gergo comune di Linux per la terminazione del processo è quello” Una procedura. In termini generali, vorremmo solo terminare una procedura con a -9 (SIGKILL) segnalare se detta procedura / il programma è bloccato. Tieni presente che ogni volta che parliamo di procedura o programma, le parole possono essere scambiate a piacimento. Semplicemente, una procedura è un qualsiasi programma (o servizio) in esecuzione che è stato dato a PID (un identificatore di procedura).

Vediamo un esempio di come terminare una procedura in background in esecuzione tramite a SIGKILL segnale alla procedura in corso. Notare che, come spiegato SIGKILL è abbastanza distruttivo e interromperà la procedura indipendentemente da ciò che la procedura vuole fare con il segnale. La procedura può catturare e reindirizzare più segnali, mentre altri no.

Invio di SIGKILL a un processo di sospensione in esecuzione in background

Qui iniziamo un sleep 1800 in sottofondo (usando & alla fine del comando), che è iniziato come il primo ([1]) procedura in background con PID 574660. Successivamente, uccidiamo quella procedura in background usando kill -9 574660, dove lui -9 Rappresenta SIGKILL.

Anche se la procedura termina immediatamente, non vediamo il messaggio di completamento (procedura in background 1 assassinato, In altre parole, [1]+ Killed) quando il prompt dei comandi ritorna prima che venga visualizzato il messaggio, In altre parole, restituire la riga di comando è stata un'operazione più rapida rispetto al completamento della procedura o equivalente.

Verifichiamo l'elenco dei processi grepping per il PID ps -ef | grep 574660. Anche se potrebbe esserci una via d'uscita, l'output mostrato è solo per la nostra esecuzione grep comando; il sleep La procedura è già terminata.

Valutiamo lo stesso con SIGTERM, In altre parole kill -15 ${PID} dove ${PID} è la procedura che vogliamo finire.

Invio di SIGTERM a un processo di sospensione in esecuzione in background

Abbiamo dovuto premere invio per attivare / mostra messaggio di completamento (come spiegato in precedenza). Possiamo vedere che il programma è terminato di nuovo correttamente. Nonostante questo, questa volta, anche se invisibile per questo particolare esempio (continua a leggere!), Internamente all'interno del sleep codice programma, le cose erano un po' diverse.

Per questo caso (usando -15 In altre parole SIGTERM per finire la procedura), il sleep La procedura è stata notificata e ha avuto la possibilità di gestire il segnale internamente. Successivamente, potrebbe rispondere auto-terminando, ignorando il segnale o tramite qualsiasi altra azione sviluppata nel codice. Inoltre possiamo dimostrare che questo è vero controllando il segnale di uscita e / o l'uscita:

La differenza dei codici di uscita e di uscita in base al segnale inviato

Qui iniziamo la procedura sleep 2000 due volte, e poi ho usato un'altra sessione di shell / terminale per terminare il programma. La prima volta che usiamo kill -9 e la seconda volta che usiamo kill -15 per fermare il sleep processi.

Notiamo subito come torna l'uscita. Killed nel primo (kill -9 azione) esempio. Per il secondo tentativo (usando kill -15), vediamo l'uscita Terminated invece di; il programma è terminato automaticamente. Dopo le rispettive terminazioni, abbiamo anche controllato i segnali di uscita e abbiamo scoperto che i codici di uscita erano diversi.

Perché questo è importante? Considera programmi più grandi; in questa circostanza, stavamo finendo un semplice sleep comando. Nessun dato è stato gestito, nessun traffico è stato inviato avanti e indietro, eccetera. Ma, Cosa succede se inviamo a kill -9 comando al nostro server di database (questo, generalmente, richiederebbe privilegi a livello di root / sudo)?

Risveglierei il database per andare in modalità di ripristino da arresto anomalo la prossima volta che viene avviato perché, per quanto ne sa il software del database, il gergo comune di Linux per la terminazione del processo è quello “il gergo comune di Linux per la terminazione del processo è quello” seguito da “qualunque”. In altre parole, si è rotto. Se invece avessimo emesso un kill -15 , il software del database potrebbe aver eseguito un arresto controllato, come esempio, prima bloccare la connessione di nuovi utenti, poi disconnettersi / terminare gli utenti esistenti, dopo aver finito di scrivere i dati, eccetera. prima in breve auto-terminare.

Invio di segnali Linux con sequenze di tasti

Lo sapevi che ogni volta che invii un CTRL+c sequenza di tasti per un programma in esecuzione, come esempio in un terminale, che invece a SIGINT è inviato? Torniamo alla nostra fiducia sleep comando e prova questo:

Un processo di sospensione interrotto da un segnale SIGINT inviato tramite una sequenza di tasti CTRL + C

Qui iniziamo sleep ancora, e poi premi la combinazione di tasti CTRL+c. Il programma è terminato, o meglio è stato interrotto per lui SIGINT segnale che è stato inviato. Chiediamo il codice di uscita e confermiamo che ancora una volta il codice di uscita è diverso dai segnali precedenti.

Si prega di notare che questo codice di uscita, per dormire, corrisponderà sempre al segnale inviato, anche se non tutti i segnali potrebbero essere coperti. In altre parole, quando si usa CTRL+c sulla riga di comando, il codice di uscita sarà sempre 130, 137 quando ucciso con kill -9, e 143 quando kill -15 è stato usato.

È possibile testare i codici di uscita del comando facendo riferimento a $? variabile, che contiene il codice di uscita del comando precedente (fintanto che non è stato avviato un nuovo comando). Conoscere il codice di uscita di un dato comando in una situazione particolare, e / o come conseguenza di un particolare segnale inviato a quel comando, aiuta nello scripting di soluzioni che gestiscono altri processi, eccetera. (come nel caso di molti script di shell, soprattutto quando si gestiscono server o ambienti automatizzati).

Un'altra sequenza di tastiera usata di frequente è CTRL+z. Questo invierà a SIGTSTP cartello, un suspend segnale che mette immediatamente in attesa una procedura fino al (come esempio) un 'fg' Il comando viene impartito per la stessa procedura che lo riporterà in primo piano.

Per maggiori informazioni sulla gestione dei processi, consultare Bash Process Termination Hacks.

Fine

In questo post, discutiamo i segnali Linux più importanti e come possiamo praticamente usarli in un ambiente Linux o Unix. Conoscere i suggerimenti di base di Linux aiuta nell'uso quotidiano e nella gestione di Linux, come esempio, quando una procedura si blocca e deve essere terminata con kill -9. In un prossimo post, possiamo considerare di catturare un segnale usando il trap comando dall'interno di uno script bash, che consente di stabilire una procedura personalizzata che verrà eseguita all'emissione di detto segnale.

Se ti è piaciuto leggere questo post, dai un'occhiata alla nostra serie di automazione bash a partire dall'automazione bash & Nozioni di base sugli script. Nel terzo post di quella serie, analizziamo anche l'amministrazione dei processi in background, che è stato menzionato in precedenza in questo post.

Iscriviti alla nostra Newsletter

Non ti invieremo posta SPAM. Lo odiamo quanto te.