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).