Skrypt powłoki zabija -9 na podstawie nazwy

28

Czy istnieje sposób (być może skrypt), jak zautomatyzować ten proces:

petr@sova:~$ ps -ef | grep middleman
petr     18445  2312  1 12:06 pts/2    00:00:01 /home/petr/.rvm/gems/ruby-1.9.3-p362/bin/middleman                                                                  
petr     18581 13621  0 12:08 pts/0    00:00:00 grep --color=auto middleman
petr@sova:~$ kill -9 18445

Niestety pkilljest zbyt słaby, ponieważ muszę korzystać z -9opcji włączonej kill.

mreq
źródło
2
Możesz używać -9ze pkillzbyt ...
Stop Harming Monica
6
Moim zdaniem jest bardziej elegancki i odpowiedni w użyciu -KILLniż -9. Jaki numer odpowiada sygnałowi zależnemu od implementacji. SIGKILLzdarza się, że jest 9na Linuksie i386 i Linux amd64, ale niekoniecznie wszędzie. ( Więcej informacji tutaj. )
Eliah Kagan
5
@EliahKagan: chociaż lubię -KILLteż używać (ponieważ sprawia, że ​​kod jest bardziej czytelny), należy zauważyć, że SIGKILL = 9jest określony przez POSIX , więc -9jest obecnie dość przenośny (i nie zależy od jąder ani architektur).
Andrea Corbellini,

Odpowiedzi:

36

Możesz użyć powłoki do wykonania tego zadania:

kill -9 $(pidof middleman)

Powłoka wykonuje pidof middlemannajpierw polecenie . Dane wyjściowe pidof (8) to identyfikator procesu. Zatem powłoka zastępuje pidof-command identyfikatorem procesu i wykonuje kill -9 18845(lub cokolwiek innego poprawnym identyfikatorem procesu).

qbi
źródło
Jaka jest różnica między tym a kill -9 $(pgrep middleman)?
Aaron Franke
54

Istnieje jeszcze prostsze rozwiązanie niż qbi: killallpozwalamy zabijać procesy według nazwy i można określać sygnały.

killall -9 middleman

Zobacz, man killallaby uzyskać więcej informacji i dodatkowe opcje (jest ich sporo).

Jak sama nazwa wskazuje, wysyła sygnał do wszystkich wymienionych procesów middleman. Ale to nie różni się od innych sposobów (jak pkill). Ponadto pkill -9 middlemanbędzie kierować procesy, których nazwa jest zgodna, ale nie jest równa middleman, na przykład middleman2także.

Gerhard Burger
źródło
2
killalldla zwycięstwa!
Andrea Corbellini,
4
zabić wszystkich pośredników? o mój drogi ...
Tobias Kienzler
16

Pozostałe odpowiedzi są całkowicie poprawne, ale równie dobrze mogę dodać trzecią opcję, aby wszystkie zostały tutaj udokumentowane. Możesz także użyć:

pkill -9 middleman

Zobacz, man pkillaby uzyskać więcej informacji i dodatkowe opcje.

Tak naprawdę nie ma znaczenia, której z tych metod używasz. Wszyscy będą działać. Ale znajomość opcji jest przydatna, jeśli chcesz w jakiś sposób zmodyfikować zachowanie, ponieważ odpowiednie strony podręcznika pokazują, jakie inne pasujące opcje są dostępne.

Robie Basak
źródło
Dziwne, tutaj nie działa. Ani niemiddleman*
mreq
1
Ach Patrząc bliżej, wydaje się prawdopodobne, że chcesz zabić tłumacza ruby, a nie proces, który naprawdę się nazywa middleman. To gdzie różnice w jaki sposób dokładnie pkill, killall, pidofi grepprocesy mecz naprawdę zacząć znaczenia!
Robie Basak
12
pkill -9 -f middleman

Ta -fopcja powoduje, że pasuje ona do pełnego wiersza poleceń, a nie tylko do nazwy procesu.

Pamiętaj, że -9powinien to być sygnał ostateczny, a nie rutynowy.

jlliagre
źródło
1
dzięki! Naprawdę podoba mi się możliwość dopasowaniacomplete command line
cwd
kompletna linia poleceń jest naprawdę fajna!
okwap,
10

Dla zabawy chciałbym dodać bardziej ręczny, oldschoolowy sposób

kill -9 `ps aux | grep middleman | awk '{print $2}'`
slipset
źródło
1
Zrobiłem to w pracy kilka lat temu, a administrator rzucił mi spojrzenie „okej, dziadku”. Można także dodać grep -v grep przed awk, aby upewnić się, że nie zabije także polecenia grep.
Iain Holder
@gerhard, dzięki za edycję, nie mogłem znaleźć tylnych tyknięć na moim iPadzie. grep -v to dobry pomysł ...
slipset
Prawdziwym sposobem starej szkoły byłoby pisanie, ... grep [m]iddleman ...aby uniknąć przypadkowego zabicia grepprocesu. W ten sposób grep nie może się dopasować z powodu śmiesznego cytowania.
Mikko Rantalainen
1
killall -9 -ir regex_pattern

który jest interaktywny (bezpieczny) i pasuje do częściowej nazwy polecenia.

Bohr
źródło