2013-03-16 13 views
47

Esiste un modo affidabile per uccidere tutti i processi di un determinato utente? kill(-1, SIGKILL) come quell'utente funzionerà, a meno che un processo non autorizzato di quell'utente uccida prima il processo di uccisione. Il meglio che riesco a trovare finora è quello di fare il ciclo attraverso system("ps -u") per quell'utente e uccidere i processi in questo modo, ma ciò sembra davvero intrusivo e inefficiente.Elimina tutti i processi per un dato utente

EDIT: Per chiarire, sto specificatamente chiedendo una soluzione compatibile POSIX. Per qualche ragione pensavo che taggare la domanda posix lo avrebbe messo nel titolo.

+3

Vale la pena notare che tutte le soluzioni qui (come è generalmente il caso con 'kill') hanno una [TOCTOU] (https: // CWE .mitre.org/data/definitions/367.html) condizioni di gara: tra l'identificazione dei processi per uccidere e ucciderli, il processo potrebbe morire e il PID potrebbe essere riciclato. Oppure potrebbero nascere nuovi processi di proprietà dell'utente, a te sconosciuti. – pilcrow

risposta

64

Just (temporaneamente) ha ucciso mio Macbook con

killall -u pu -m . 

dove pu è il mio userid. Guarda il punto alla fine del comando.

provare anche

pkill -u pu 

o

ps -o pid -u pu | xargs kill -1 
+0

Grazie, ma killall e pkill AFAICT non fanno parte di POSIX (vedi modifica alla mia domanda) –

+0

Il comando ho appena aggiunto OK con POSIX? – uselpa

+0

Ah, è una buona cosa! Sembra che non sia possibile dalle funzioni di libreria definite solo in POSIX, quindi contrassegnerò ciò accettato. –

1

Che dire di iterazione sul file system virtuale/proc? http://linux.die.net/man/5/proc?

+0

Grazie, ma/proc non fa parte di POSIX (vedi modifica alla mia domanda) –

+0

@Shea Levy Nessun problema, per favore tenete a mente che "ps -u" non è POSIX di per sé ma più * nix oriented :) –

+0

Hmm, dalla mia lettura di http://pubs.opengroup.org/onlinepubs/9699919799/utilities/ps.html sembra che sia ... –

27

Ecco un uno di linea che fa questo, basta sostituire il nome utente con il nome utente che si desidera uccidere le cose per. Non pensare nemmeno a mettere radici lì!

pkill -9 -u `id -u username` 

Nota: se si desidera essere carino, rimuovere -9, ma non uccide tutti i tipi di processi.

5

Su LINUX Debian, io uso: ps -o pid= -u username | xargs sudo kill -9.

Con -o pid= l'intestazione ps viene soppressa e l'output è solo la lista pid. Per quanto ne so, Debian shell è conforme a POSIX.

0

Il seguente uccide tutti i processi creati da questo utente:

kill -9 -1 
+1

Secondo POSIX, kill -9 -1 deve essere interpretato come kill (-1, SIGKILL)."Se pid è -1, sig deve essere inviato a tutti i processi (escluso un insieme non specificato di processi di sistema) per il quale il processo ha il permesso di inviare quel segnale." Quindi dallo standard (e, FWIW, su macOS) questo ucciderà anche il processo stesso. –