Jak mogę grepować wyjście PS z umieszczonymi nagłówkami?
Te dwa procesy tworzą aplikację działającą na moim serwerze ....
root 17123 16727 0 16:25 pts/6 00:00:00 grep GMC
root 32017 1 83 May03 ? 6-22:01:17 /scripts/GMC/PNetT-5.1-SP1/PNetTNetServer.bin -tempdir /usr/local/GMC/PNetT-5.1-SP1/tmpData -D
nie 6-22:01:17
oznacza to, że został uruchomiony przez 6 dni? Próbuję ustalić, jak długo trwa proces ...
Czy druga kolumna jest identyfikatorem procesu? Więc jeśli kill 32017
to zrobię, zabije drugi proces?
ps -e
Wybiera więc wszystkie procesy ips -f
jest listą w pełnym formacie, która pokazuje nagłówki kolumn. Następnie potokujemy nagłówki kolumn i wyprowadzamy je do egrep, który jest rozszerzonym grep i pozwala na|
specjalne znaczenie potoku , którym jest OR (to OR to). W rezultacie dopasowujesz PID w nagłówkach kolumn i linie wyjściowe, które mają znaczenie.ps -ef | grep -E 'GMC|PID'
Dzięki geekozaurowi chciałbym użyć tego polecenia do swoich potrzeb, a nie oddzielnego polecenia:
Trudne jest skorzystanie z „;” obsługiwany przez powłokę w celu połączenia polecenia.
źródło
ps -ef
powtórzenie. jeszcze lepiej jestps -ef | { head -1 ; grep "your-pattern" ; }
ps -ef | { head -1; grep "pattern" | head -5; }
. Przydatne, jeśli wzór grep-ed ma wiele wyników!Druga kolumna to identyfikator procesu; Czwarty to czas, w którym proces został utworzony (zwykle jest to czas uruchomienia programu, ale nie zawsze; rozważ
execve()
i przyjaciele); Szósta to ilość zajętego czasu procesora. Działa więc od 8 dni i zużywa prawie 7 dni czasu procesora, co uważam za niepokojące.Uzyskiwanie nagłówka w tym samym wywołaniu jest w najlepszym razie trudne; Po prostu zrobiłbym osobny
ps | head -1
. Możesz rozważyć użycieps
własnych metod selekcji lub czegoś podobnegopgrep
zamiastgrep
, który tak naprawdę nie jest przeznaczony do przepuszczania nagłówków.źródło
83
?nice
wartości przypisanej przez użytkownika lub system . Mniejsze liczby mają wyższy priorytet. W tym przypadkugrep
ma priorytet 0, ponieważ został zablokowany podczas odczytu dysku i dał wynik do zapisania danych wyjściowych, iPNetTNetServer.bin
jest dużą liczbą, ponieważ konsekwentnie wykorzystuje swój przedział czasu bez blokowania. (Planowanie jest skomplikowane, a szczegóły zależą od używanego harmonogramu.)Rozwiązanie egrep jest proste i użyteczne, ale oczywiście zależy od nagłówka, który zawsze zawiera „PID” (choć bardziej niż rozsądne założenie) i ten sam ciąg znaków, który nie występuje nigdzie indziej. Domyślam się, że to wystarczy dla twoich potrzeb, ale w przypadku, gdy ktoś chce alternatywy, jest sed.
Sed pozwala po prostu powiedzieć „wydrukuj pierwszą linię, a następnie dowolną linię zawierającą wzór”. Na przykład:
Dodaj,
/sed -n/d;
aby odfiltrować sed:źródło
/sed -n/d
nie jest dobrze. Być może istnieje istniejące poleceniesed -n
, które chcesz wydrukować. Sztuką jest używaćsed -n '1p; /[P]ROCESS_NAME_TO_SEARCH/p'
. ;-) Uwaga[]
wokół dowolnego znaku w ciągu wyszukiwania.łatwiejsza alternatywa:
ps -ef | { head -1; grep GMC; }
zamień liczbę na liczbę wierszy, w których wyświetlany jest nagłówek.
źródło
ps -ef | { head -1; grep GMC; }
. Podoba mi się również w funkcji takiej jak:function pgrep() { ps -ef | { head -1; grep $@; } }
możesz dostać pid z pgrep
a następnie użyj ps z pid
lub nawet połączyć je w jedno polecenie
Spowoduje to wyświetlenie tylko żądanej linii i dołączenie nagłówka.
źródło
Napisałem mały program w Perlu, który wydrukuje
Najczęściej używam go w ten sposób
ps | 1andre GMC
, ale może również przyjmować argumenty pliku (każdy plik ma własną linię nagłówka dla dopasowań wykonanych w liniach z tego pliku).źródło