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 $pid
pierwszy, 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
killall
robi dokładnie to, co sugeruje nazwa ... zabija proces inicjowania.
pkill
polecam, 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 vi
zabija 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 vi
z ostatnim argumentem kończącym się na .conf
, użyj pkill -fx 'vi.*\.conf'
.
Aby zobaczyć listę PID, na pkill
któ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 ps
nie 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 -k
aby wysłać im sygnał. Na przykład fuser -k /usr/bin/find
zabija 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 -1234
lub kill -HUP -1234
inny sygnał.
Jeśli nie możesz znaleźć lepszego sposobu, użyj ps
z odpowiednimi opcjami, aby wyświetlić listę wszystkich procesów i przefiltrować go za pomocą grep
innego 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 grep
lub awk
samo polecenie może być wymienione w danych ps
wyjściowych ( ps
a 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 ps
wyjściowych.
pkill
jest tu bardzo miło. Możesz podać wiele parametrów w celu dopracowania wzoru.
pkill
jest 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 kill
bez 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 -ef
do pkill
lub 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
pkill
zprocps
pakietu.