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?
setuid()
wybranymi procesami .Odpowiedzi:
Użyj
pkill -U UID
lubpkill -u UID
lub nazwy użytkownika zamiast UID. Czasamiskill -u USERNAME
może działać, innym narzędziem jestkillall -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
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
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
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/proc
cyfrowych 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ą
getpwnam
wywołanie biblioteki do analizy argumentu-u
opcji, a parsowana będzie tylko nazwa użytkownika.pkill
(procps & procps-ng) używa zarówno atolu, jak i getpwnam do parsowania-u
/-U
argumentów i zezwala na numeryczny i tekstowy specyfikator użytkownika.źródło
killall -u USERNAME
działał jak urokJeśli przekażesz -1 jako argument ID procesu do
kill
polecenia powłoki lubkill
funkcji 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ącegokill
polecenie lub syscall.W C (pominięto sprawdzanie błędów):
źródło
Jeśli funkcja pkill jest niedostępna w twojej dystrybucji UNIX / Linux, możesz uruchomić następującą komendę jako użytkownik root:
gdzie nazwa użytkownika to użytkownik, którego procesy chcesz usunąć
źródło
pkill -U username
.źródło
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:źródło