ps -ef | grep xyz

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 [email protected] -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ę:

Komenda listująca procesy zawierające słowo apache wyświetla m. in. samą siebie (ostatnia linijka, proces numer 43429)

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!

1 Comment

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

Leave a Comment

Komentarze mile widziane.

Jeżeli chcesz do komentarza wstawić kod, użyj składni:
[code]
tutaj wstaw swój kod
[/code]