Pełen wdzięku sposób na zabicie procesu

12

Po zakończeniu mojego skryptu bash na serwerze selenium, skrypt zabija go w następujący sposób:

kill `ps -ef | grep selenium | awk '{ print $2 }'`

Chociaż to działa i zabija skrypt selenu, próbuje również zabić proces. grep seleniumWięc do czasu, gdy numer procesu powróci do komendy kill, proces zniknie, więc kończy się generowaniem komunikatu o błędzie. (Innymi słowy: kończy się to zabiciem dwóch procesów, jeden z nich to prawdziwy serwer selenu, drugi to przelotny proces, który jest efektem ubocznym tego, jak wykonuję to polecenie).

Czy istnieje bardziej wdzięczny sposób na zabicie tego procesu, który nie ma tego niezamierzonego efektu ubocznego?

(FWIW miałem jeden pomysł: ten sam skrypt uruchamia selen wcześniej w skrypcie, więc może gdyby istniał sposób na uchwycenie PID podczas uruchamiania selenu, mógłbym go zatrzymać i zabić bezpośrednio, zamiast żartować identyfikator procesu. Problem polega na tym, że nie wiem, jak uzyskać ten PID, jak używać zmiennej, aby ją zachować, i jak odwoływać się do niej później w skrypcie. Ale czy to lepszy sposób, aby to zrobić?)

Eric
źródło

Odpowiedzi:

12

Spróbuj użyć, pkill seleniumjeśli ani to, ani jeden z pozostałych nie działa, możesz nadal używać metody z inną sekwencją potoku, taką jak

kill `ps -ef|grep -i selenium| grep -v grep| awk '{print $2}'`
Momo
źródło
pkill nie działa w tym przypadku na moim serwerze, ale ulepszony pasek grep bardzo pomaga.
Eric
20

Wypróbuj pgreppolecenie, które wyświetli PID polecenia, którym jesteś zainteresowany.

pgrep selenium

Aby faktycznie zabić proces, użyj pkillpolecenia towarzyszącego .

pkill selenium
młyny013
źródło
Uwielbiam elegancję tego, ale proces wygląda następująco: „root 26401 11997 2 23:20 pkt / 1 00:00:00 java -jar /home/lm/cron/selenium-server-standalone-2.19.0. jar ”, więc właśnie to zmieniłem pgrep javai działa :-) dzięki!
Eric
2
Jeśli podasz pgrep flagę „-f”, dopasuje wzór do całej linii poleceń. Tak więc w tym przypadku zabójstwo pgrep -f seleniumpowinno zadziałać
mills013
7
korzystanie pkilljest o wiele prostsze. pkillużywa dokładnie takich samych kryteriów, jak pgrep, więc możesz to zrobić w 1 poleceniu zamiast 2 (i musisz polegać na wynikach jednego).
Patrick
7

Spróbuj użyć grep [s]elenium. To nie znajdzie procesu grep.

BillThor
źródło
To naprawdę przydatna sztuczka. Dlaczego to działa?
2
@hesse - grepdomyślnie używa BRE. Oznacza to, [i ]pokazać się w argvza grep, ale to nie pasuje, bo [i ]nie są używane dosłownie grep.
Chris Down,
Często używałem | grep -v grepkomponentu w rurze. Ale to jest dość eleganckie i podoba mi się!
Alexios
To (często) nie wystarczy, jeśli masz plik w bieżącym katalogu roboczym o tej samej nazwie co proces, którego szukasz. Więc rozwiązanie normalnie używam jest: ps -ef | grep \[s]elenium. Chociaż okazało lsofsię, że jest znacznie lepszą alternatywą dla używania psi grep.
Moreaki,
2

killallPolecenie nie zostało wspomniane, i czuję, że jest użytecznym dodatkiem do repertuaru.

$ killall selenium

Możesz także użyć tej -r regexopcji, aby określić wyrażenie regularne pasujące do nazwy procesu, a nawet wartość czasu:

$ killall -o 5m selenium 

Zabija wszystkie procesy selenu starsze niż 5 minut.

kwarrick
źródło
Wydaje się to być unikalne dla wersji innych niż RHEL / CentOSkillall
ewwhite
0

Użyj -m 1przełącznika z poleceniem grep, aby pobrać tylko pierwszy znaleziony proces. Tak długo, jak posortujesz swoje procesy według PID, rosnąco, będzie działać.

hellodanylo
źródło
1
Nie możesz być pewien, że proces selenu wykorzystuje niższy PID.
FJRA,
FJRA, proces rozpoczęty wcześniej zawsze ma niższy PID. Ponieważ serwer selenu jest uruchamiany przed „grep selen”, otrzyma niższy PID.
hellodanylo