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 selenium
Wię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ć?)
Wypróbuj
pgrep
polecenie, które wyświetli PID polecenia, którym jesteś zainteresowany.Aby faktycznie zabić proces, użyj
pkill
polecenia towarzyszącego .źródło
pgrep java
i działa :-) dzięki!pgrep -f selenium
powinno zadziałaćpkill
jest o wiele prostsze.pkill
używa dokładnie takich samych kryteriów, jakpgrep
, więc możesz to zrobić w 1 poleceniu zamiast 2 (i musisz polegać na wynikach jednego).Spróbuj użyć
grep [s]elenium
. To nie znajdzie procesu grep.źródło
grep
domyślnie używa BRE. Oznacza to,[
i]
pokazać się wargv
zagrep
, ale to nie pasuje, bo[
i]
nie są używane dosłowniegrep
.| grep -v grep
komponentu w rurze. Ale to jest dość eleganckie i podoba mi się!ps -ef | grep \[s]elenium
. Chociaż okazałolsof
się, że jest znacznie lepszą alternatywą dla używaniaps
igrep
.killall
Polecenie nie zostało wspomniane, i czuję, że jest użytecznym dodatkiem do repertuaru.Możesz także użyć tej
-r regex
opcji, aby określić wyrażenie regularne pasujące do nazwy procesu, a nawet wartość czasu:Zabija wszystkie procesy selenu starsze niż 5 minut.
źródło
killall
Użyj
-m 1
przełą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ć.źródło