Introduzione

Alcune applicazioni potrebbero iniziare a comportarsi in modo irregolare e non rispondere o iniziare a consumare molte risorse di sistema. Le applicazioni che non rispondono non possono essere riavviate perché il processo dell'applicazione originale non si arresta mai completamente. L'unica soluzione è riavviare il sistema o terminare il processo dell'applicazione.

Esistono diverse utility che ti consentono di terminare i processi errati, il comando kill è il più comunemente usato.

Comando Kill

kill è una shell integrata nella maggior parte delle shell derivate da Bourne come Bash e Zsh. Il comportamento del comando è leggermente diverso tra le shell e l'eseguibile autonomo /bin/kill.

Utilizzare il comando type per visualizzare tutte le posizioni sul proprio sistema contenenti kill:

type -a kill
kill is a shell builtin
kill is /bin/kill

L'output sopra indica che l'integrato della shell ha la priorità sull'eseguibile autonomo e viene utilizzato ogni volta che si digita kill. Se si desidera utilizzare il file binario, digitare il percorso completo del file /bin/kill. In questo articolo, useremo Bash builtin.

La sintassi del comando kill assume la forma seguente:

kill [OPTIONS] [PID]..

Il comando kill invia un segnale a processi o gruppi di processi specificati, facendoli agire in base al segnale. Quando il segnale non è specificato, per impostazione predefinita è -15(-TERM).

I segnali più comunemente usati sono:

  • 1( HUP) - Ricarica un processo.
  • 9( KILL) - Termina un processo.
  • 15( TERM) - Arresta con grazia un processo.

Per ottenere un elenco di tutti i segnali disponibili, invoca il comando con l'opzione -l:

kill -l

 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR
31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX

I segnali possono essere specificati in tre modi diversi:

  1. Usando il numero (es. -1 O -s 1).
  2. Utilizzando il prefisso "SIG" (ad es. -SIGHUP O -s SIGHUP).
  3. Senza il prefisso "SIG" (ad es. -HUP O -s HUP).

I seguenti comandi sono equivalenti tra loro:

kill -1 PID_NUMBER
kill -SIGHUP PID_NUMBER
kill -HUP PID_NUMBER

I PID forniti al comando kill possono essere uno dei seguenti:

  • Se PID è maggiore di zero, il segnale viene inviato al processo con ID uguale a PID.
  • Se PID è uguale a zero, il segnale viene inviato a tutti i processi nel gruppo di processi corrente. In altre parole, il segnale viene inviato a tutti i processi appartenenti al GID della shell che ha invocato il comando kill. Utilizzare il comando ps -efj per visualizzare gli ID del gruppo di processi (GID).
  • Se PID è uguale a -1, il segnale viene inviato a tutti i processi con lo stesso UID dell'utente che invoca il comando. Se l'utente che sta invocando è root, il segnale viene inviato a tutti i processi tranne init e il processo kill stesso.
  • Se PID è inferiore a -1, il segnale viene inviato a tutti i processi nel gruppo di processi e con GID uguale al valore assoluto di PID.

Gli utenti regolari possono inviare segnali ai propri processi, ma non quelli che appartengono ad altri utenti, mentre l'utente root può inviare segnali ai processi di altri utenti.

Terminare i processi usando il comando Kill

Per terminare o terminare un processo con il comando kill, è innanzitutto necessario trovare il numero ID del processo (PID). È possibile farlo utilizzando i comandi diversi, come top, ps, pidof e pgrep.

Supponiamo che il browser Firefox non abbia risposto e che sia necessario interrompere il processo di Firefox. Per trovare i PID del browser, utilizzare il comando pidof:

pidof firefox

Il comando stamperà gli ID di tutti i processi di Firefox:

6263 6199 6142 6076

Una volta che conosci i numeri dei processi, puoi terminarli tutti inviando il segnale TERM:

kill -9 2551 2514 1963 1856 1771

Invece di cercare PID e quindi terminare i processi, è possibile combinare i comandi sopra in uno:

kill -9 $(pidof firefox)

Ricaricare i processi usando il comando Kill

Un altro caso d'uso comune del comando kill è l'invio del segnale HUP, che indica ai processi di ricaricare le sue impostazioni.

Ad esempio, per ricaricare Nginx, è necessario inviare un segnale al processo principale. L'ID processo del processo master Nginx è reperibile nel file nginx.pid, che in genere si trova nella directory /var/run.

Utilizzare il comando cat per trovare il PID principale:

cat /var/run/nginx.pid
30251

Una volta trovato il PID principale, ricarica le impostazioni di Nginx digitando:

sudo kill -1 30251

Il comando sopra deve essere eseguito come utente root o utente con privilegi sudo.

Conclusione

Il comando kill viene utilizzato per inviare un segnale ai processi. Il segnale utilizzato più frequentemente è SIGKILL o -9, che termina i processi indicati.