Filtrowanie wyjściowych poleceń

12

Korzystam z komputera Mac i chcę filtrować dane wyjściowe toppolecenia dla określonego procesu, tak aby wyświetlane były tylko kolumny PID, COMMAND i% CPU.

Po uzyskaniu PID procesu uruchamiam:

top -pid 1234

Wyświetla to jednak ponad 15 kolumn dla tego procesu. Czy mogę przesłać dane wyjściowe polecenia do programu awk i wyświetlić tylko:

PID COMMAND %CPU

kolumny?

Nie chcę przechowywać danych wyjściowych w pliku tekstowym, a następnie przetwarzać. Jestem zainteresowany monitorowaniem procesu w czasie rzeczywistym.

palenie tytoniu
źródło

Odpowiedzi:

8
top -pid 3907 -stats "pid,command,cpu"
  • -pid 3907: Twój identyfikator procesu
  • -stats pid,command,cpu: pokaż tylko identyfikator procesu, nazwę i% procesora

Nie ma potrzeby uruchamiania awkna wyjściu.


Jeśli chcesz przetworzyć dane wyjściowe, użyj, -l 0aby uruchomić w trybie rejestrowania (0 oznacza w nieskończoność, wszystko inne ogranicza liczbę próbek). Wyjście będzie wyglądać tak (dwa powtórzenia):

Processes: 72 total, 3 running, 1 stuck, 68 sleeping, 326 threads 
2011/05/10 19:15:13
Load Avg: 0.14, 0.14, 0.09 
CPU usage: 20.0% user, 26.66% sys, 53.33% idle 
SharedLibs: 5304K resident, 5208K data, 0B linkedit.
MemRegions: 16345 total, 1048M resident, 54M private, 338M shared.
PhysMem: 726M wired, 1802M active, 687M inactive, 3215M used, 750M free.
VM: 169G vsize, 1036M framework vsize, 5261732(0) pageins, 552476(0) pageouts.
Networks: packets: 46747406/52G in, 32528901/3715M out.
Disks: 9452898/244G read, 11226269/293G written.

PID   COMMAND      %CPU
3907  WindowServer 0.0 
Processes: 72 total, 3 running, 1 stuck, 68 sleeping, 326 threads 
2011/05/10 19:15:14
Load Avg: 0.13, 0.14, 0.09 
CPU usage: 0.95% user, 1.90% sys, 97.14% idle 
SharedLibs: 5304K resident, 5208K data, 0B linkedit.
MemRegions: 16346 total, 906M resident, 54M private, 386M shared.
PhysMem: 726M wired, 1802M active, 687M inactive, 3215M used, 751M free.
VM: 169G vsize, 1036M framework vsize, 5261732(0) pageins, 552476(0) pageouts.
Networks: packets: 46747406/52G in, 32528901/3715M out.
Disks: 9452898/244G read, 11226269/293G written.

PID   COMMAND      %CPU
3907  WindowServer 2.7 

Użyj awklub podobnego narzędzia, aby wyświetlić tylko co 13 linię (ponieważ te linie zawierają wartości w tym przykładzie):

$ top -l 0 -pid 3907 -stats pid,command,cpu | awk 'NR%13==0'
3907  WindowServer 0.0 
3907  WindowServer 1.3 
3907  WindowServer 2.2 
Daniel Beck
źródło
# top -p1 -stats "pid,command,cpu" top: unknown option 't'
AstraSerg
@AstraSerg działa dla mnie. Pamiętaj, że jest to pytanie dotyczące systemu Mac OS, które różni się topod Linuksa.
Daniel Beck
6

Z pewnością można to zrobić i wyjaśnię, jak bym to zrobił. Nie udaję, że to optymalne podejście, ale działa. Używam Linuksa (i powłoki bash), więc domyślne zachowanie mojego topa może się nieco różnić. Dlatego może być konieczne dostosowanie tego mini-howto do konkretnego scenariusza.

  1. Po prostu uruchom top , bez żadnych argumentów:

    $ top

    Oto nagłówek i odpowiedni wiersz z mojego wyjścia:

    PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND

    2569 user 20 0 339m 86m 10m S 7.8 6.9 6:42.99 java

    Wybrałem proces, który pozostaje w pamięci przez pewien czas i faktycznie zużywa procesor, będę go używać jako procesu testowego do osiągnięcia ostatecznego celu.

  2. Domyślnie top działa w trybie interaktywnym. To mi nie odpowiada, chcę uchwycić odpowiednie dane i wydrukować je. Po tym zajmę się zadaniem interaktywnego wyświetlania danych. Odpowiednie cytaty z górnej strony:

    -b: Operacja w trybie wsadowym Zaczyna górę w „trybie wsadowym”, co może być przydatne do wysyłania danych wyjściowych z góry do innych programów lub do pliku. W tym trybie top nie akceptuje danych wejściowych i działa, dopóki limit iteracji nie zostanie ustawiony za pomocą opcji wiersza polecenia „-n” lub dopóki nie zostanie zabity.

    -n: Limit liczby iteracji jako: -n liczba Określa maksymalną liczbę iteracji lub ramek, które góra powinna wygenerować przed zakończeniem.

    To jest dostosowane górne polecenie, które drukuje dane wyjściowe tylko raz, a następnie kończy działanie:

    $ top -b -n 1

  3. Znam PID, który chcę oglądać, więc dodam jeszcze jedno ograniczenie do góry, więc drukuje dane tylko o tym procesie:

    $ top -b -n 1 -p 2569

  4. Nawet w trybie wsadowym top nadal drukuje nagłówek, zawierający różne statystyki systemowe, takie jak czas pracy, wolna pamięć / zamiana itp. Nie potrzebuję tego. Potrzebuję tylko jednego wiersza - tego, który zawiera dane o moim procesie, więc wytnę go z całego wyjścia w następujący sposób:

    $ top -b -n 1 -p 2569 | tail -n 2 | head -n 1

    Jak widać, mam drugą linię od 1.

  5. Poprowadzę tę linię do awk, aby wyodrębnić tylko kolumny, których potrzebuję:

    $ top -b -n 1 -p 2569 | tail -n 2 | head -n 1 | awk '{print $1, $12, $9}'

  6. Do tej pory robiłem te manipulacje w wierszu poleceń, teraz nadszedł czas, aby dodać trochę wytrwałości i elastyczności do naszego zakodowanego konkretnego przypadku. Przenoszę całą linię do prostego skryptu powłoki. Nazwie to 3top , nazwa jest podkreślona, ​​ponieważ będzie używana później:

    #!/bin/bash

    top -b -n 1 -p 2569 | tail -n 2 | head -n 1 | awk '{print $1, $12, $9}'

  7. Numer PID jest zakodowany na stałe, oto jak ustawić skrypt, aby akceptował go jako argument wiersza poleceń:

    #!/bin/bash

    top -b -n 1 -p "$1" | tail -n 2 | head -n 1 | awk '{print $1, $12, $9}'

    Aby wyświetlić statystyki 3top dotyczące PID 2569, należy go nazwać w następujący sposób:

    $ ./3top 2569

  8. Chcę również wyświetlać procent po obciążeniu procesora, więc dostrajam mój skrypt 3top w następujący sposób:

    #!/bin/bash

    out=$(top -b -n 1 -p "$1" | tail -n 2 | head -n 1 | awk '{print $1, $12, $9}')

    echo "$out%"

    Przekierowałem cały wynik łańcucha poleceń (połączonych potokami) na zmienną. Następnie po prostu drukuję go za pomocą echa i dodam „%” na końcu, ponieważ obciążenie procesora jest ostatnim polem

  9. W tym momencie mam skrypt wsadowy, który akceptuje PID jako argument i wyświetla statystyki raz. Chcesz zamiast tego monitorować w czasie rzeczywistym? To proste, ponieważ zegarek może to zrobić! Uruchom skrypt w następujący sposób:

    $ watch -n 1 3top 2569

    Będzie monitorował w czasie rzeczywistym, uruchamiając 3top raz na sekundę.

vtest
źródło
11
Użytkownik jest w systemie OS X i nie ma GNU top. niepoprawna opcja lub składnia: -b . Nie mam pojęcia, dlaczego było to wielokrotnie oceniane.
Daniel Beck
5
Gnu top(w procps), nie może być zainstalowany przy użyciu Homebrew, DarwinPorts lub Fink i nie może zostać skompilowany z kodu źródłowego pomocą jednej makelub cc top.c.
Daniel Beck
2

topFormat wyświetlania jest konfigurowalny, ale nie jest to sposób, aby określić opcje wyświetlania w wierszu poleceń. Jeśli jesteś pomysłowy, możesz prawdopodobnie zrobić to, czego potrzebujesz, sprytnie manipulując ~/.toprcplikiem.

Zakładając, że nie dostosowałeś już wyświetlania top(i nie masz ~/.toprcpliku):

  1. Uruchom top.
  2. Naciśnij, faby przejść do trybu wyboru pola.
  3. Dla każdego pola, które ma *obok niego, którego nie chcesz, naciśnij odpowiednią literę, aby odznaczyć to pole. Na przykład naciśnij, eaby odznaczyć User Namepole. Kiedy skończysz, trzeba mieć tylko *obok Process Id, CPU usagei Command name/line.
  4. Naciśnij, Spaceaby powrócić do głównego okna.
  5. Naciśnij W(tj. Shift+ w), Aby zapisać bieżący układ w ~/.toprcpliku.
  6. Zamknij top, a następnie uruchom ponownie, aby sprawdzić, czy ustawienia zostały zapisane.
  7. Jeśli chcesz powrócić do domyślnego układu, zmień nazwę ~/.toprcna coś takiego jak ~/min.toprcprzed uruchomieniem top. Jeśli chcesz przełączyć się na minimalny układ, zmień nazwę z ~/min.toprcpowrotem na ~/.toprcprzed uruchomieniem top.

Ten plik topmoże zostać zmieniony w prosty skrypt powłoki przez kogoś, kto ma więcej doświadczenia i wiedzy niż ja. Będziesz potrzebować szczególnej uwagi, jeśli Twój zwykły topukład został już dostosowany.

William Jackson
źródło
Czy można dodać filtr (nawet jeśli ręcznie) .toprc? Chciałbym dodać filtr RUID>999przy uruchomieniu.
Dr Beco,