it-swarm-eu.dev

Jak mohu zabít všechny procesy uživatele pomocí jejich UID

Chci zabít všechny běžící procesy konkrétního uživatele buď skriptem Shell nebo nativním kódem v systému Linux.

Musím si přečíst adresář/proc a hledat je?

Nějaké nápady? Existuje dynamické mapování pidů pod UID v Linuxu? Není to v proc?

Pokud ne, kde je tento seznam veden? Měl bych z toho číst? Kde je také statický seznam všech identifikátorů UID v systému, abych mohl ověřit, že tento uživatel existuje, a pak pokračovat v zabíjení všech procesů, které jsou pod ním spuštěny?

45
user489152

Použijte pkill -U UID nebo pkill -u UID nebo uživatelské jméno místo UID. Někdy skill -u USERNAME může fungovat, jiným nástrojem je killall -u USERNAME .

Skill byl specifický pro linux a je nyní zastaralý a pkill je přenosnější (Linux, Solaris, BSD).

pkill umožňuje číselné i symbolické UID, efektivní a skutečné http://man7.org/linux/man-pages/man1/pkill.1.html

pkill - ... signální procesy založené na jménu a dalších atributech

    -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.

Manová stránka dovednosti říká, že je povoleno používat pouze uživatelské jméno, nikoli uživatelské jméno: http://man7.org/linux/man-pages/man1/skill.1.html

skill, snice ... Tyto nástroje jsou zastaralé a nepřenosné. Syntaxe příkazu je špatně definována. Zvažte použití killall, pkill

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

killall není v Linuxu označen jako zastaralý, ale také nebude fungovat s číselným UID; pouze uživatelské jméno: http://man7.org/linux/man-pages/man1/killall.1.html

killall - zabíjí procesy podle jména

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

Myslím, že jakýkoli nástroj používaný k nalezení procesu ve stylu Linux/Solaris/proc (procfs) použije úplný seznam procesů (provede nějaký readdir z /proc). Myslím, že budou iterovat přes /proc digitální podsložky a zkontrolovat shodu všech nalezených procesů.

Chcete-li získat seznam uživatelů, použijte getpwent (získá jeden uživatel na hovor).

Nástroje skill (procps & procps-ng) a killall (psmisc) používají getpwnam volání knihovny pro analýzu argumentu -u možnost a bude analyzováno pouze uživatelské jméno. pkill (procps & procps-ng) používá atol i getpwnam pro analýzu -u/-U argument a povolit numerické i textové uživatelské specifikace.

60
osgx

Pokud předáte -1 jako argument ID procesu buď kill Shell příkaz nebo kill C funkce , pak je signál zaslána do všech procesů, které může dosáhnout, což v praxi znamená všechny procesy uživatele, který spouští příkaz kill nebo syscall.

su -c 'kill -TERM -1' bob

V C (kontrola chyb vynechána):

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

Pokud funkce pkill není k dispozici v distribuci UNIX/Linux, můžete jako uživatel root spustit následující příkaz:

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

kde username je uživatel, jehož procesy chcete odstranit

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

To pro mě pěkně fungovalo. Všechny pid procesy najdete podle uživatelského jména provedením ps U <username> a odtamtud. Zkuste to:

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