Qual è lo scopo dell'opzione -9 nel comando kill?


Risposte:


28

La pagina man di Ubuntu per killspiega lo scopo del -9passaggio (certamente in modo piuttosto discontinuo):

Name     Num   Action    Description
KILL       9   exit      cannot be blocked

Ecco cosa dice un'altra pagina man .

Il comando killinvia il segnale specificato al processo o al gruppo di processi specificato. Se non viene specificato alcun segnale, il TERMsegnale viene inviato. Il TERMsegnale ucciderà i processi che non catturano questo segnale. Per altri processi, potrebbe essere necessario utilizzare il segnale KILL( 9), poiché questo segnale non può essere catturato.


Pertanto, l'utilizzo -9dell'interruttore garantisce che il processo venga effettivamente interrotto. Anche se un processo congelato o non risponde potrebbe non rispondere a un semplice TERM segnale, morirà quando viene inviato un KILLsegnale.


40

Il comando kill invierà un segnale definito a un processo con una data identità (PID):

kill -<signal> <pid>

Ovviamente possiamo solo uccidere i processi che possediamo, mentre root può uccidere tutti i processi. Vedi Wikipedia per un bel riassunto dei segnali di calcolo.

I segnali che killpossono essere inviati sono elencati nella manpage . Il segnale può essere rappresentato per nome o per numero. Se non viene emesso alcun segnale, il segnale predefinito 15 risp. TERMviene utilizzato.

Tutti e tre i comandi seguenti sono quindi identici:

kill -9 1234
kill -KILL 1234
kill -SIGKILL 1234

La differenza tra SIGTERMe SIGKILLè il modo in cui un'applicazione può agire sul segnale:

  • TERM: un'applicazione sarà in grado di terminare, ovvero eseguire correttamente una routine di spegnimento.
  • KILL: le applicazioni vengono arrestate e uccise immediatamente (il che potrebbe comportare la perdita di dati o l'aumento di app per segnalare in alcuni casi un presunto arresto anomalo).

16

Si noti che tutti i seguenti sono sinonimi:

kill -9 1234
kill -KILL 1234
kill -SIGKILL 1234

Vale la pena sottolineare che nel mondo della gestione del segnale, SIGKILL è uno dei pochi unici gestiti dal sistema operativo e non dal programma. Quando esegui kill -9, non stai dicendo all'applicazione di terminare se stessa, invece stai dicendo al sistema operativo di interrompere l'esecuzione del programma, indipendentemente da ciò che il programma sta facendo.

Dopo l' invio di SIGKILL , il programma verrà immediatamente arrestato. Se sono in esecuzione chiamate del kernel (ad esempio File IO) per conto del programma, tali chiamate possono o non possono continuare fino al termine, a seconda della chiamata, ma il programma stesso non verrà più eseguito. Si noti che le attività tracciate o le attività in esecuzione in un debugger potrebbero comportarsi diversamente qui.

L'altro segnale che non può essere bloccato è SIGSTOP che ha un effetto simile, ma blocca invece il programma; puoi inviare SIGCONT in seguito per riprenderlo. Questo comportamento è completamente controllato dal sistema operativo e il programma non riceve alcuna notifica preventiva.

Tutti gli altri segnali vengono inviati al programma; può gestirli come desidera, oppure se ignora il segnale, viene seguito un comportamento predefinito.

Ecco alcuni segnali utili che potresti trovarti a inviare a un processo:

  • SIGHUP - hangup
    Indica al programma che l'utente si è disconnesso (ad es. Sessione SSH o finestra del terminale chiusa).
    Di solito esegue un arresto regolare del programma.
  • SIGINT - interruzione
    Inviato quando si preme CTRL+ C
    Solitamente significa "interrompi ciò che si sta facendo" - può o meno uccidere il programma
  • SIGTERM - termina
    L'impostazione predefinita inviata da kille killall.
    Di solito termina il programma ... a volte dopo che il programma termina qualunque cosa stia facendo.
  • SIGSTOP - stop
    Inviato quando si premeCTRL + Z
    Mette in pausa il programma, discusso sopra
  • SIGPIPE - pipe closed
    Indica al programma che la pipeline è stata chiusa. Di solito termina il programma.
    Ad esempio cat /etc/passwd | head -n1, invierà SIGPIPE al catprocesso dopo la stampa della prima riga, causando la catchiusura prima del completamento dell'intero file.

Mentre tutti questi segnali si verificano "naturalmente" nella propria impostazione, è possibile utilizzare il segnale per simulare una condizione per ottenere il risultato desiderato.

Ad esempio, se vuoi terminare la sessione SSH di qualcuno, puoi semplicemente terminare il processo, ma così facendo impedirai che aggiorni il suo file HISTORY, che può essere importante per motivi di sicurezza. Ma invece se lo invii SIGHUP , il processo supporrà che la connessione sia terminata ed eseguirà la sua pulizia standard.


Ctrl + \ invia SIGQUIT, dove l'azione predefinita è scaricare il core e terminare. Questo può essere usato se un programma sta facendo qualcosa di molto sbagliato, devi fermarlo immediatamente e vorresti poterlo eseguire il debug in un secondo momento.
Simon Richter,

@SimonRichter Oh, hai ragione. fisso.
Tylerl,

6

kill -9 Significato: il processo verrà ucciso dal kernel; questo segnale non può essere ignorato. 9 indica il segnale KILL che non è comprensibile o ignorabile

Usi: SIGKILL singal

Kill Significato: il comando kill senza alcun segnale passa il segnale 15, che termina il processo in modo normale.

Usi: segnale SIGTERM , che può essere gestito dai programmatori

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.