kill (Unix)
In informatica kill (dalla lingua inglese to kill, uccidere) è un comando dei sistemi operativi Unix e Unix-like, e più in generale dei sistemi POSIX[1], che invia un segnale ad uno o più processi tipicamente per provocarne la terminazione (come suggerisce il nome), oppure visualizza informazioni sui segnali.
kill è anche il nome di una chiamata di sistema definita dallo standard POSIX[2] che invia un segnale ad un processo. Di fatto il comando kill agisce invocando l'omonima chiamata di sistema.
Il comando kill
[modifica | modifica wikitesto]La sintassi generale del comando kill presenta due forme: una per inviare un segnale ad uno o più processi, e l'altra per ottenere informazioni sui segnali.
Invio di segnali
[modifica | modifica wikitesto]La sintassi in questo caso è:
kill [opzioni] [--] arg1 [arg2 …]
I parametri arg identificano i processi a cui inviare i segnali, che possono essere specificati nei due modi che seguono:
- dei PID, secondo le stesse convenzioni dell'omonima chiamata di sistema (per cui è anche possibile specificare
0
o-1
o valori inferiori); - degli identificativi di job della shell, secondo la seguente sintassi:
%%
o%+
: indica il job corrente;%-
: indica il job precedente;%n
: indica il job con identificativo n;%stringa
: indica il job la cui riga di comando inizia con stringa;%?stringa
: indica il job la cui riga di comando contiene stringa.
Il doppio trattino -- (facoltativo) indica che i parametri successivi non sono da considerarsi opzioni.
Il comportamento predefinito è quello di inviare il segnale SIGTERM.
Tra le opzioni vi sono:
- -s segnale
- Invia il segnale specificato invece di SIGTERM. Il parametro segnale può essere specificato sia in forma simbolica, con o senza il prefisso "SIG", sia in forma numerica, e può essere anche 0 per verificare solo la possibilità di spedire segnali
- -segnale
- Equivale all'uso di "-s segnale" (sintassi tradizionale).
Ad esempio "kill -s SIGKILL 1234", "kill -9 1234" e "kill -KILL 1234" sono equivalenti tra loro.
Informazioni sui segnali
[modifica | modifica wikitesto]La sintassi in questo caso è:
kill -l [valore]
Il parametro facoltativo valore può indicare:
- il numero di un segnale, nel qual caso viene scritto sullo standard output il nome del segnale senza il prefisso "SIG";
- il valore di uscita di un comando che è terminato a causa del ricevimento di un segnale, come ad esempio ottenuto dalla variabile speciale "$?" della shell testuale, nel qual caso viene scritto sullo standard output il nome (senza il prefisso "SIG") del segnale che ha causato la terminazione del comando.
Notare che non è corretto specificare un valore di uscita qualsiasi, ma occorre prima accertarsi che la terminazione sia dovuta ad un segnale (tipicamente, in questo caso, il valore di uscita è maggiore di 128).
Se il parametro valore non è specificato, viene prodotto sullo standard output un elenco dei segnali noti al sistema.
Esempi
[modifica | modifica wikitesto]Manda il segnale SIGTERM ai processi aventi PID 1234 e 5689:
kill 1234 5689
Manda il segnale SIGKILL al processo 1234:
kill -s SIGKILL 1234
Manda il segnale SIGKILL al processo 1234:
kill -KILL 1234
Manda il segnale SIGKILL al processo 1234:
kill -9 1234
Elenca i segnali disponibili:
kill -l
Manda il segnale SIGTERM ai processi del job corrente della shell (solitamente l'ultimo avviato):
kill %%
Manda il segnale SIGTERM ai processi del job numero 5 della shell:
kill %5
Alternative
[modifica | modifica wikitesto]In alcuni sistemi operativi Unix e Unix-like sono disponibili anche i comandi killall e pkill, che inviano un segnale a tutti i processi che soddisfano dei criteri di ricerca specificati come parametri. Con questi comandi è ad esempio possibile inviare un segnale a tutti i processi di un dato utente, o a tutti quelli il cui nome contiene una stringa specificata.
La chiamata di sistema kill
[modifica | modifica wikitesto]La chiamata di sistema kill è dichiarata nello header file signal.h:
#include <signal.h> int kill(pid_t pid, int sig);
Prima di inviare il segnale, essa verifica che il chiamante abbia il permesso di inviare segnali al processo o al gruppo di processi indicato.
Il tipo pid_t è un tipo opaco che rappresenta un PID e che inoltre può anche assumere un valore uguale o inferiore a zero.
Il parametro pid indica il processo o il gruppo di processi a cui inviare il segnale:
- se è maggiore di 0, il segnale specificato da sig è inviato al processo avente il PID specificato;
- se è uguale a 0, il segnale specificato da sig è inviato a tutti i processi del gruppo di processi di cui il chiamante fa parte;
- se è uguale a -1, il segnale specificato da sig è inviato a tutti i processi del sistema a cui il chiamante ha il permesso di inviare segnali, eccetto che ad un insieme ristretto di processi che dipende dall'implementazione (tipicamente init);
- se è minore di -1, il segnale specificato da sig sarà inviato a tutti i processi appartenenti al gruppo di processi identificato dal valore assoluto di pid.
Il parametro sig indica il segnale da spedire; le costanti che identificano i segnali sono elencate nello header file signal.h. Se è 0 non viene spedito alcun segnale, ma si verifica unicamente la possibilità di inviare segnali al processo o al gruppo di processi indicati.
Valore di ritorno
[modifica | modifica wikitesto]In caso di successo viene ritornato il valore 0, altrimenti viene ritornato il valore -1 e la variabile errno indica l'errore specifico.
Errori
[modifica | modifica wikitesto]Quando kill ritorna -1, errno può valere:
- EINVAL – sig non è un numero di segnale valido.
- EPERM – Il chiamante non ha il permesso di inviare il segnale sig al processo o al gruppo di processi identificato da pid.
- ESRCH – Non esiste processo o gruppo di processi corrispondenti al pid specificato.
Note
[modifica | modifica wikitesto]- ^ (EN) kill (utilities), in The Open Group Base Specifications Issue 7 IEEE Std 1003.1-2008. URL consultato il 14-06-2009.
- ^ (EN) kill (functions), in The Open Group Base Specifications Issue 7 IEEE Std 1003.1-2008. URL consultato il 14-06-2009.
Voci correlate
[modifica | modifica wikitesto]- Ps (Unix) – elenca i processi del sistema