Polecenie w tytule dzisiejszego wpisu wyszukuje wszystkie procesy systemowe, kt贸re by艂y uruchomione z tekstem "xyz", przy czym owo xyz to mo偶e by膰 zar贸wno sama nazwa polecenia (b膮d藕 jej fragment) jak te偶 opcja lub parametr.
Bardziej konkretny przyk艂ad: za艂贸偶my, 偶e uruchomili艣my wcze艣niej tunel ssh do jakiego艣 zdalnego serwera i chcemy teraz sprawdzi膰, czy proces tunelu ci膮gle dzia艂a.
Tunel uruchomili艣my poleceniem, dajmy na to:
ssh byniek@mojserwer.pl -L 1234:mojserwer.pl:1234
Je偶eli chcemy teraz wy艣wietli膰 list臋 proces贸w zawieraj膮cych w wierszu polece艅 s艂owo mojserwer
, zrobimy tak:
ps -ef | grep mojserwer
Efekt? Lista proces贸w zgodnie z oczekiwaniem, plus jeden: powy偶sza komenda grep
te偶 zawiera s艂owo mojserwer
(jako parametr), wi臋c te偶 si臋 pojawi na li艣cie. A tego przecie偶 nie chcemy.
Przyk艂ad obrazuj膮cy o czym m贸wi臋:
W przypadku og贸lnym nie jest to jaki艣 wielki problem. Ale czasem piszemy skrypt, kt贸ry b臋dzie modyfikowa艂 istniej膮ce procesy (na przyk艂ad wy艂膮cza艂 je) i wtedy mo偶e si臋 okaza膰, 偶e ubijemy proces, kt贸rego nie powinni艣my.
Rozwi膮zanie?
Wyra偶enia regularne!
A konkretnie jeden prosty trick:
Tutaj nie widzimy na li艣cie procesu grep
, bo wyszukujemy proces贸w zawieraj膮cych s艂owo apache
, a nie [a]pache
. Poniewa偶 jednak grep
traktuje sw贸j pierwszy parametr jako wyra偶enie regularne, znajdzie nam wszystkie procesy z apache
w wierszu polece艅, bo apache
pasuje do [a]pache
.
Voila!
Mo偶na tak偶e:
ps -ef | grep mojserwer | grep -v ” grep ”
albo, skoro raczej chodzi nam o ubijanie proces贸w, czyli zapewne o PID, skorzysta膰 z pgrep:
pgrep mojserwer
Z opcjonalnym -f (man pgrep).