Come posso uccidere tutti i processi di un utente usando il loro UID


41

Voglio uccidere tutti i processi in esecuzione di un determinato utente da uno script shell o da un codice nativo su un sistema Linux.

Devo leggere la directory / proc e cercarli?

Qualche idea? Esiste una mappatura dinamica dei pid sotto gli UID in Linux? Non è questo nel proc?

In caso contrario, dove viene mantenuto questo elenco? Dovrei leggere da esso? Inoltre, dov'è l'elenco statico di tutti gli UID nel sistema in modo che io possa convalidare questo utente e quindi procedere a uccidere tutti i processi in esecuzione sotto di esso?


6
Vuoi uno strumento per fare questo (pkill, slay, ne esistono altri) o vuoi scriverlo da solo? Se il primo, il sito di scambio di stack superutente è probabilmente migliore. Se quest'ultimo, scansionare / proc e prendere nota di tutti i processi da parte di un utente specifico è la strada da percorrere. Il codice sorgente per l'utilità pkill, ad esempio, mostrerebbe come farlo.

Potresti chiarire di cosa tratta questa domanda alla luce del commento di @ LarsWirzenius? Grazie!
Caleb,

@Caleb: volevo uccidere i processi leggendo il / proc perché non sapevo di alcuno strumento che lo facesse. Inoltre ora trovo che diversi da "kill", "pkill", "skill" ecc. Non siano disponibili sul mio sistema. In tal caso, suppongo di dover guardare le alternative di script di shell per leggere / proc e capire come ottenere processi con un solo utente. Qualche idea?
user489152

1
Per quanto riguarda "l'elenco statico di tutti gli UID ... quindi posso convalidare questo utente esiste": non esiste una cosa come la convalida di un ID utente. I nomi utente provengono da un database, ma gli ID utente sono qualunque sia la scelta di un processo in esecuzione setuid().
Gilles 'SO- smetti di essere malvagio' il

Risposte:


53

Utilizzare pkill -U UIDo pkill -u UIDo nome utente anziché UID. A volte skill -u USERNAMEpuò funzionare, un altro strumento è killall -u USERNAME.

Skill era specifico per Linux ed è ora obsoleto e pkill è più portatile (Linux, Solaris, BSD).

pkill consente UID sia numerici che simbolici, effettivi e reali http://man7.org/linux/man-pages/man1/pkill.1.html

pkill - ... elabora i segnali in base al nome e ad altri attributi

    -u, --euid euid,...
         Only match processes whose effective user ID is listed.
         Either the numerical or symbolical value may be used.
    -U, --uid uid,...
         Only match processes whose real user ID is listed.  Either the
         numerical or symbolical value may be used.

La pagina man di skill dice che è permesso usare solo username, non ID utente: http://man7.org/linux/man-pages/man1/skill.1.html

abilità, snice ... Questi strumenti sono obsoleti e non portabili. La sintassi del comando è mal definita. Prendi in considerazione l'utilizzo di killall, pkill

  -u, --user user
         The next expression is a username.

killall non è contrassegnato come obsoleto in Linux, ma non funzionerà con l'UID numerico; solo nome utente: http://man7.org/linux/man-pages/man1/killall.1.html

killall - uccide i processi per nome

   -u, --user
         Kill only processes the specified user owns.  Command names
         are optional.

Penso che qualsiasi utilità usata per trovare processi in stile Linux / Solaris / proc (procfs) utilizzerà l'elenco completo dei processi (facendo un readdir di /proc). Penso che passeranno in rassegna le /procsottocartelle digitali e controlleranno ogni processo trovato per la corrispondenza.

Per ottenere un elenco di utenti, utilizzare getpwent(otterrà un utente per chiamata).

Gli strumenti skill (procps & procps-ng) e killall (psmisc) utilizzano entrambi la getpwnamchiamata in libreria per analizzare l'argomento -udell'opzione e verrà analizzato solo il nome utente. pkill(procps & procps-ng) utilizza sia atol che getpwnam per analizzare -u/ -Uargomento e consentire sia l' identificatore utente numerico che testuale.


1
pkill non è obsoleto. Potrebbe non essere portabile al di fuori di Linux, ma la domanda riguardava specificamente Linux.

1
per ottenere l'elenco degli utenti usa il solo liner: getent passwd | awk -F: '{print $ 1}'
Petesh

che ne dici di dare un comando del tipo: "kill -ju UID" dalla chiamata C () del sistema?

1
è un Linux incorporato? non hai abilità, pkill e killall? Anche la shell incorporata busybox ha pkill e killall.
osgx,

2
killall -u USERNAMEha funzionato come per incanto
michalzuber il

8

Se si passa -1 come argomento dell'ID processo al killcomando shell o alla killfunzione C , il segnale viene inviato a tutti i processi che può raggiungere, il che in pratica significa tutti i processi dell'utente che esegue il killcomando o syscall.

su -c 'kill -TERM -1' bob

In C (controllo errori omesso):

if (fork() == 0) {
    setuid(uid);
    signal(SIGTERM, SIG_DFL);
    kill(-1, SIGTERM);
}

5

Se la funzione pkill non è disponibile sulla distribuzione UNIX / Linux, è possibile eseguire il seguente comando come utente root:

ps -ef | grep username | grep -v grep | awk '{print $2}' | xargs kill

dove username è l'utente che elabora i processi


o solo il pkill -U username.
osgx,


0

Questo ha funzionato bene per me. Puoi trovare tutti i pid dei processi in base al nome utente facendo ps U <username>e passare da lì. Prova questo:

ps U <username> | cut -d " " -f 1 | xargs kill
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.