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?
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.
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
pgrep -U username|xargs kill -9
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