2013-03-16 12 views
47

Czy istnieje niezawodny sposób na zabicie wszystkich procesów danego użytkownika? kill(-1, SIGKILL) ponieważ ten użytkownik będzie działał, chyba że fałszywy proces tego użytkownika zabije najpierw proces zabijania. Najlepsze, co mogę znaleźć, to przeplatanie się przez tego użytkownika i zabijanie procesów w ten sposób, ale to wydaje się naprawdę zjadliwe i nieefektywne.Zabij wszystkie procesy dla danego użytkownika.

EDYCJA: Aby wyjaśnić, proszę o rozwiązanie kompatybilne z POSIX. Z jakiegoś powodu pomyślałem, że oznaczenie tagu "posix" umieści to w tytule.

+3

Warto zauważyć, że wszystkie rozwiązania tutaj (jak to ma zazwyczaj miejsce w przypadku 'kill') mają [TOCTOU] (https: // CWE .mitre.org/data/definitions/367.html) stan wyścigu: pomiędzy identyfikacją procesów do zabijania i zabijania ich, proces może umrzeć i jego PID może zostać poddany recyklingowi. Mogą też powstać nowe procesy należące do tego użytkownika, nieznane użytkownikowi. – pilcrow

Odpowiedz

64

tylko (tymczasowo) zabił mojego MacBooka z

killall -u pu -m . 

gdzie pu jest mój identyfikator użytkownika. Obserwuj kropkę na końcu polecenia.

Sponsorowane

pkill -u pu 

lub

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

Dzięki, ale AFAICT killall i pkill nie są częścią POSIX (zobacz edytuj na moje pytanie) –

+0

Czy polecenie właśnie dodałem OK z POSIX? – uselpa

+0

Ach, to jest dobre! Wygląda na to, że nie jest to możliwe z funkcji bibliotecznych zdefiniowanych w POSIX-ie, więc zaznaczę to jako zaakceptowane. –

1

Co z iteracją w wirtualnym systemie plików/proc? http://linux.die.net/man/5/proc?

+0

Dzięki, ale/proc nie jest częścią POSIX (patrz edytuj na moje pytanie) –

+0

@Shea Levy Nie ma problemu, proszę również wziąć pod uwagę, że "ps -u" również nie jest POSIX per se ale bardziej * nix oriented :) –

+0

Hmm, z mojego czytania http://pubs.opengroup.org/onlinepubs/9699919799/utilities/ps.html wygląda na to, że jest ... –

27

Oto jeden liner, że robi to, po prostu zastąpić nazwę użytkownika z nazwą użytkownika, który chcesz zabić rzeczy. Nawet nie myśl o umieszczeniu korzenia w tym miejscu!

Uwaga: jeśli chcesz być miły, usuń -9, ale nie zabije on wszystkich procesów.

5

Na Debianie LINUX używam: ps -o pid= -u username | xargs sudo kill -9.

Z -o pid= nagłówek ps jest wyłączony, a wynik jest tylko listą pid. O ile mi wiadomo, Debian shell jest zgodny z POSIX.

0

Poniższy zabija wszystkie procesy utworzone przez tego użytkownika:

kill -9 -1 
+1

Zgodnie z POSIX, kill -9 -1 należy interpretować jako kill (-1, SIGKILL)."Jeśli pid wynosi -1, sig zostanie wysłany do wszystkich procesów (z wyjątkiem nieokreślonego zestawu procesów systemowych), dla których proces ma pozwolenie na wysłanie tego sygnału." Tak więc standard (i FWIW na MacOS) zabije również sam proces zabijania. –

Powiązane problemy