Jak podać argumenty do zabicia przez potok

85

Muszę znaleźć pewien proces i go zabić. Napisałem takie polecenie:

ps -e | grep dmn | awk '{print $1}' | kill

Gdzie jest nazwa procesu dmn. Ale to nie działa. Jak mogę znaleźć procesy według nazwy i killich.

user567879
źródło

Odpowiedzi:

162
kill $(ps -e | grep dmn | awk '{print $1}')
Daniel Persson
źródło
8
Użyj nowszej $()składni: kill $(ps -e | grep dmn | awk '{print $1}').
Stratus3D
7
fwiw dla innych, musiałem zmodyfikować tę odpowiedź, aby działała: kill $(ps -efw | grep dmn | grep -v grep | awk '{print $2}')nie wiem dlaczego i nie przejmuję się zbytnio zajrzyj do niej.
joshweir
1
@joshweir To dlatego, że w inny sposób killpróbował zabić nawet proces
``
Czy nie byłoby to wymagane \npo każdym awk, jak w awk '{print $1"\n"}'?
Sopalajo de Arrierez
43

Jeśli istnieje wiele procesów, które chcesz usunąć, możesz użyć tego:

ps -efw | grep dmn | grep -v grep | awk '{print $2}' | xargs kill

Uwaga: Musisz usunąć sam proces grep z wyjścia, dlatego grep -v grepjest używany.

jcollado
źródło
17
Możesz uniknąć pojawienia się
grepa
1
@Oldskool Niezła sztuczka. Używanie metacharaktere, aby wyrażenie regularne grep nie pasowało do siebie, jest dobrym pomysłem.
jcollado
@Oldskool, +1, jesteś geniuszem!
jcr
Niezła sztuczka, chociaż sprawia, że ​​przekształcenie go w skrypt powłoki jest bardziej skomplikowane
Metagrapher
17

Możesz użyć

pkill dmn 

jeśli twój system ma polecenie pkill .

unutbu
źródło
1
+1 za pkill zamiast killall. Jest dostępny na wielu platformach bez innego "znaczenia" ( killall w Solaris jest na przykład odpowiednikiem killall5 w Linuksie - to znaczy zabij WSZYSTKIE procesy)
plundra
4

Dodam tylko inne, ale lubię używać możliwości funkcji regex awk:

kill $(ps | awk '/dmn/{print $1}')
pedmiston
źródło
4

Jeśli masz pidofpolecenie w swoim systemie (wiem, że powłoki takie jak ZSH są domyślnie dostarczane z tym, chyba że się mylę), możesz zrobić coś takiego.

kill -9 $(pidof dmn)
Nathan F.
źródło
2

Możesz także użyć killall :

killall dmn
Narty
źródło
2

Możesz tego nie potrzebować pipe, jeśli masz pidofpolecenie i znasz nazwę obrazu, zrobiłem to tak:

kill $(pidof synergyc)

$()Rozumiem to, ponieważ konwertuje to wyjście na zmienną, której może użyć kill, zasadniczo tak, jak zrobiłby to pipe. Krótsze i łatwiejsze do zrozumienia niż niektóre inne opcje, ale może też mniej elastyczne i bardziej bezpośrednie.

NotVeryPythonic
źródło
0
for procid in $(ps -aux | grep "some search" | awk '{print $2}'); do kill -9 $procid; done

cześć przyjaciele ... możemy to zrobić za pomocą pętli for.

„Some search” to tutaj nazwa procesu, który chcesz przeszukać, na przykład „java”, więc powiedzmy, że liczba procesów w Javie to 200+, więc zabijanie jednego po drugim będzie zbyt typowe.

więc możesz użyć powyższego polecenia.

Dzięki.

Nishant
źródło
0

Używaj pgrepz opcją -f. kill $(pgrep -f dmn)

Deepak Sharma
źródło
4
Jeśli tak pgrep, dlaczego nie po prostu pkill -f dmn?
muru