it-swarm.it

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

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?

45
user489152

Uso pkill -U UID o pkill -u UID o nome utente anziché UID. Qualche volta skill -u USERNAME potrebbe 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 numerici e 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à utilizzata per trovare processi in stile Linux/Solaris/proc (procfs) utilizzerà l'elenco completo dei processi (facendo un readdir di /proc). Penso che ripeteranno /proc sottocartelle digitali e verifica la corrispondenza di ogni processo trovato.

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

abilità (procps & procps-ng) e killall (psmisc) gli strumenti usano entrambi getpwnam chiamata in libreria per analizzare l'argomento di -u opzione e verrà analizzato solo il nome utente. pkill (procps & procps-ng) sa sia atol che getpwnam per analizzare -u/-U argomento e consenti specificatore utente sia numerico che testuale.

60
osgx

Se si passa -1 come argomento dell'ID processo a kill comando Shell o kill C funzione , il segnale è inviato a tutti i processi che può raggiungere, il che in pratica significa tutti i processi dell'utente che esegue il comando kill 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);
}

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

5
David
pgrep -U username|xargs kill -9
1
Alexander

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

ps U <username> | cut -d " " -f 1 | xargs kill
0
jasonrhaas