Jak zabić wszystkie procesy użytkownika przy użyciu ich identyfikatora UID


41

Chcę zabić wszystkie uruchomione procesy konkretnego użytkownika ze skryptu powłoki lub kodu natywnego w systemie Linux.

Czy muszę czytać katalog / proc i ich szukać?

Jakieś pomysły? Czy istnieje dynamiczne mapowanie pidów pod UID w Linuksie? Czy to nie jest w proc?

Jeśli nie, to gdzie jest utrzymywana ta lista? Czy powinienem z niego czytać? Gdzie jest też statyczna lista wszystkich identyfikatorów UID w systemie, dzięki czemu mogę zweryfikować, czy ten użytkownik istnieje, a następnie zabić wszystkie działające pod nim procesy?


6
Czy chcesz, aby narzędzie to zrobiło (pkill, slay, inni istnieją), czy może chcesz to napisać samodzielnie? Jeśli to pierwsze, witryna wymiany stosu administratora jest prawdopodobnie lepsza. Jeśli to drugie, skanowanie / proc i zapisywanie notatek dla wszystkich procesów przez konkretnego użytkownika jest dobrym rozwiązaniem. Kod źródłowy narzędzia pkill pokazałby na przykład, jak to zrobić.

Czy możesz wyjaśnić, na czym polegało to pytanie w świetle komentarza @ LarsWirzenius? Dzięki!
Caleb

@Caleb: Chciałem zabić procesy, czytając / proc, ponieważ nie wiedziałem, że robi to jakiekolwiek narzędzie. Teraz też okazuje się, że inne niż „zabij”, „pkill”, „umiejętność” itp. Nie są dostępne w moim systemie. W takim przypadku myślę, że muszę spojrzeć na alternatywne skrypty powłoki, aby przeczytać / proc i znaleźć sposób na uzyskanie procesów pod jednym użytkownikiem. Jakieś pomysły?
user489152,

1
Odnośnie „statycznej listy wszystkich UID-ów… abym mógł zweryfikować, czy ten użytkownik istnieje”: nie ma czegoś takiego jak sprawdzanie poprawności ID użytkownika. Nazwy użytkowników pochodzą z bazy danych, ale identyfikatory użytkowników są dowolnymi setuid()wybranymi procesami .
Gilles „SO- przestań być zły”

Odpowiedzi:


53

Użyj pkill -U UIDlub pkill -u UIDlub nazwy użytkownika zamiast UID. Czasami skill -u USERNAMEmoże działać, innym narzędziem jest killall -u USERNAME.

Umiejętność była specyficzna dla systemu Linux i jest obecnie nieaktualna, a pkill jest bardziej przenośny (Linux, Solaris, BSD).

pkill dopuszcza zarówno numeryczne, jak i symboliczne identyfikatory UID, skuteczne i rzeczywiste http://man7.org/linux/man-pages/man1/pkill.1.html

pkill - ... przetwarza sygnały na podstawie nazwy i innych atrybutów

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

Strona umiejętności mówi, czy dozwolone jest używanie tylko nazwy użytkownika, a nie identyfikatora użytkownika: http://man7.org/linux/man-pages/man1/skill.1.html

umiejętności, snice ... Te narzędzia są przestarzałe i nie można ich przenosić. Składnia polecenia jest źle zdefiniowana. Rozważ użycie killall, pkill

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

killall nie jest oznaczony jako nieaktualny w Linuksie, ale również nie będzie działał z numerycznym UID; tylko nazwa użytkownika: http://man7.org/linux/man-pages/man1/killall.1.html

killall - zabijaj procesy według nazwy

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

Myślę, że każde narzędzie użyte do znalezienia procesu w stylu Linux / Solaris / proc (procfs) wykorzysta pełną listę procesów (wykonując pewien readdir /proc). Myślę, że będą iterować po /proccyfrowych podfolderach i sprawdzać zgodność każdego znalezionego procesu.

Aby uzyskać listę użytkowników, użyj getpwent(dostanie jednego użytkownika na połączenie).

Narzędzia umiejętności (procps i procps-ng) i killall (psmisc) wykorzystują getpwnamwywołanie biblioteki do analizy argumentu -uopcji, a parsowana będzie tylko nazwa użytkownika. pkill(procps & procps-ng) używa zarówno atolu, jak i getpwnam do parsowania -u/ -Uargumentów i zezwala na numeryczny i tekstowy specyfikator użytkownika.


1
pkill nie jest przestarzały. Może to być niemożliwe do przeniesienia poza Linuksem, ale pytanie dotyczyło konkretnie Linuksa.

1
aby uzyskać listę użytkowników, użyj jednej linijki: getent passwd | awk -F: „{print $ 1}”
Petesh

co powiesz na polecenie: „kill -ju UID” z wywołania C system ()?

1
czy to osadzony linux? nie masz umiejętności, pkill i killall? Nawet wbudowana powłoka busybox ma pkill i killall.
osgx

2
killall -u USERNAMEdziałał jak urok
michalzuber

8

Jeśli przekażesz -1 jako argument ID procesu do killpolecenia powłoki lub killfunkcji C , wówczas sygnał zostanie wysłany do wszystkich procesów, które może osiągnąć, co w praktyce oznacza wszystkie procesy użytkownika uruchamiającego killpolecenie lub syscall.

su -c 'kill -TERM -1' bob

W C (pominięto sprawdzanie błędów):

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

5

Jeśli funkcja pkill jest niedostępna w twojej dystrybucji UNIX / Linux, możesz uruchomić następującą komendę jako użytkownik root:

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

gdzie nazwa użytkownika to użytkownik, którego procesy chcesz usunąć


lub po prostu pkill -U username.
osgx


0

To mi ładnie działało. Możesz znaleźć wszystkie pid procesów według nazwy użytkownika, wykonując ps U <username>i stamtąd. Spróbuj tego:

ps U <username> | cut -d " " -f 1 | xargs kill
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.