Załóżmy, że mam uruchomionych tysiąc lub więcej instancji dowolnego procesu (na przykład vi). Jak zabić ich wszystkich za pomocą jednego strzału / jednej linii / jednej komendy?
Załóżmy, że mam uruchomionych tysiąc lub więcej instancji dowolnego procesu (na przykład vi). Jak zabić ich wszystkich za pomocą jednego strzału / jednej linii / jednej komendy?
Odpowiedzi:
Co jest nie tak z dobrym starym
for pid in $(ps -ef | grep "some search" | awk '{print $2}'); do kill -9 $pid; done
Istnieją sposoby na zwiększenie wydajności,
for pid in $(ps -ef | awk '/some search/ {print $2}'); do kill -9 $pid; done
i inne odmiany, ale na poziomie podstawowym zawsze mi się to udawało.
echo kill -9 $pidpierwszy, więc wiem, co otrzymuję. Nie jestem pewien, czy AIX ma pkill, czyli mój unikatowy chleb i masło. I czy naprawdę jest wystarczająco źle, aby zostać odrzuconym - dziwne.
csh
Użyj killall,
killall vi
To zabije wszystkie polecenia o nazwie „vi”
Możesz również dodać sygnał, np. SIGKILL
killall -9 vi
killall -9 vi
killallrobi dokładnie to, co sugeruje nazwa ... zabija proces inicjowania.
pkillpolecam, jeśli jest dostępny ( Linux , FreeBSD , NetBSD , OpenBSD , Solaris ). Można określić procesy według nazwy polecenia, pełnego wiersza polecenia lub innych kryteriów. Na przykład pkill vizabija wszystkie programy, których nazwa polecenia zawiera podłańcuch vi. Aby zabić tylko wywoływane procesy vi, użyj pkill -x vi. Aby zabić tylko procesy wywoływane viz ostatnim argumentem kończącym się na .conf, użyj pkill -fx 'vi.*\.conf'.
Aby zobaczyć listę PID, na pkillktóre wysyłany byłby sygnał, użyj pgrep, który ma dokładnie taką samą składnię, z tym wyjątkiem, że nie przyjmuje nazwy lub numeru sygnału. Aby zobaczyć więcej informacji o tych procesach, uruchom
ps -p "$(pgrep …)"
Pod Linuksem potrzebujesz ps -p $(pgrep -d, …)zamiast tego (to błąd: Linux psnie jest zgodny z POSIX).
Innym powszechnym sposobem identyfikacji procesów do zabicia są procesy, które mają otwarty plik (który może być wykonywalny). Możesz je wymienić za pomocą fuser; użyj, fuser -kaby wysłać im sygnał. Na przykład fuser -k /usr/bin/findzabija wszystkie uruchomione liczby find.
Jeśli istnieje niekontrolowany proces, który wciąż się rozwidla, być może trzeba zabić całą grupę procesów naraz. Grupa procesów jest identyfikowana przez negatyw jej lidera, który jest procesem przodka wszystkich procesów w grupie. Aby zobaczyć grupę procesów, do której należy proces, uruchom ps -o pgid(plus dowolną opcję, aby wybrać proces (y) do wyświetlenia). Jeśli stwierdzisz, że chcesz zabić lidera grupy procesowej 1234 i wszystkie jego elementy potomne, uruchom kill -1234lub kill -HUP -1234inny sygnał.
Jeśli nie możesz znaleźć lepszego sposobu, użyj psz odpowiednimi opcjami, aby wyświetlić listę wszystkich procesów i przefiltrować go za pomocą grepinnego polecenia filtrowania tekstu. Uważaj, aby przypadkowo nie dopasować innych procesów uruchamiających polecenie o podobnej nazwie lub z argumentem zawierającym tę nazwę. Na przykład:
kill $(ps -o pid -o comm | awk '$2 == "vi" {print $1}')
Pamiętaj, że twoje polecenie greplub awksamo polecenie może być wymienione w danych pswyjściowych ( psa polecenie filtrowania jest uruchamiane równolegle, więc to, czy się pojawi, zależy od czasu). Jest to szczególnie ważne, jeśli argumenty polecenia są zawarte w danych pswyjściowych.
pkilljest tu bardzo miło. Możesz podać wiele parametrów w celu dopracowania wzoru.
pkilljest dostępny na Linux, BSD i Solaris - afaik. Ma więc większy zasięg niż killall.
Najłatwiejszym sposobem jest sprawdzenie, czy otrzymujesz właściwe identyfikatory procesów za pomocą:
pgrep -f [part_of_a_command]
Jeśli wynik jest zgodny z oczekiwaniami. Iść z:
pkill -f [part_of_a_command]
pgrep -f "command name"
Ciekawe, nikt o tym nie wspominał. pidof generuje oddzielone spacjami pidy procesów pasujące do nazwy przekazanego procesu. Jako taki, możesz bezpośrednio użyć jego wyjścia killbez orurowania. Na Arch Linux używam
kill -9 $(pidof <proc name>)
Wadą tego rozwiązania jest to, że nie pozwala ono na użycie wyrażeń regularnych.
Proponuję ci spróbować pkill.
Dawny: ps -ef | pkill -f command
Aby wyświetlić listę wszystkich procesów, które mają zostać zabite, najpierw spróbuj pgrep:
Dawny: ps -ef | pgrep -f command
ps -efdo pkilllub pgrep? Te polecenia nie odczytują ze standardowego wejścia.
$ ps -eaf | grep "xyz" | grep -v grep | awk 'print $2' | xargs kill
ps -ef | pgrep -f "search" | xargs kill -9
pkillzprocpspakietu.