Фильтрация вывода верхней команды


12

Я использую Mac и хочу отфильтровать вывод topкоманды для определенного процесса, чтобы отображались только столбцы PID, COMMAND и% CPU.

После получения PID процесса я запускаю:

top -pid 1234

Однако это отображает более 15 столбцов для этого процесса. Могу ли я передать вывод команды в awk и отобразить только:

PID COMMAND %CPU

столбцы?

Я не хочу хранить вывод в текстовом файле, а затем обработать его. Я заинтересован в мониторинге процесса в режиме реального времени.

Ответы:


8
top -pid 3907 -stats "pid,command,cpu"
  • -pid 3907: ваш идентификатор процесса
  • -stats pid,command,cpu: показывать только идентификатор процесса, имя и процессор%

Не нужно запускать awkна выходе.


Если вы хотите постобработать вывод, используйте -l 0для запуска в режиме регистрации (0 означает неопределенно, все остальное ограничивает количество выборок). Вывод будет выглядеть так (два повторения):

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 

Используйте awkили аналогичный инструмент для отображения только каждой 13-й строки (так как эти строки содержат значения в этом примере):

$ 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 

# top -p1 -stats "pid,command,cpu" top: unknown option 't'
AstraSerg

@AstraSerg работает для меня. Обратите внимание, что это вопрос Mac OS, который отличается topот Linux.
Даниэль Бек

6

Это, безусловно, можно сделать, и я собираюсь объяснить, как я это сделаю. Я не притворяюсь, что это оптимальный подход, но он делает свою работу. Я использую Linux (и оболочку bash), поэтому поведение моего топа по умолчанию может немного отличаться. Таким образом, вам может понадобиться настроить этот мини-Howto для вашего конкретного сценария.

  1. Просто запустите top без каких-либо аргументов:

    $ top

    Вот заголовок и соответствующая строка из моего вывода:

    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

    Я выбрал процесс, который остается в памяти на некоторое время и фактически потребляет процессор, я буду использовать его в качестве процесса тестирования для достижения конечной цели.

  2. По умолчанию top работает в интерактивном режиме. Это меня не устраивает, я хочу захватить соответствующие данные и распечатать их. После этого я справлюсь с задачей интерактивного отображения данных. Соответствующие цитаты из верхней страницы руководства:

    -b: Операция в пакетном режиме Начинает сверху в «Пакетном режиме», что может быть полезно для отправки вывода сверху в другие программы или в файл. В этом режиме top не принимает ввод и запускается до тех пор, пока не будет установлен предел итераций, заданный параметром командной строки '-n', или пока он не будет уничтожен.

    -n: Количество итераций ограничено как: -n число Определяет максимальное количество итераций, или фреймов, которые top должен произвести до окончания.

    Это скорректированная команда top, которая печатает вывод только один раз, а затем завершает работу:

    $ top -b -n 1

  3. Я знаю PID, который хочу посмотреть, поэтому добавлю еще одно ограничение в начало, чтобы оно печатало данные только об этом процессе:

    $ top -b -n 1 -p 2569

  4. Даже в пакетном режиме top по-прежнему печатает заголовок, содержащий разные системные статистические данные, такие как время работы, свободная память / обмен и т. Д. Мне это не нужно. Все, что мне нужно, - это только одна строка - та, которая содержит данные о моем процессе, поэтому я вырежу их из всего вывода следующим образом:

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

    Как видите, у меня вторая строка из 1.

  5. Я передам эту строку в awk, чтобы извлечь только нужные мне столбцы:

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

  6. До сих пор я выполнял эти манипуляции в командной строке, сейчас пришло время добавить немного настойчивости и гибкости в наш жестко запрограммированный конкретный случай. Я перемещаю всю строку в простой сценарий оболочки. Я назову это 3top , имя подчеркнуто, потому что оно будет использовано позже:

    #!/bin/bash

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

  7. Номер PID жестко закодирован, вот как заставить скрипт принять его в качестве аргумента командной строки:

    #!/bin/bash

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

    Чтобы отобразить статистику 3top о PID 2569, его необходимо вызвать так:

    $ ./3top 2569

  8. Я также хочу, чтобы процент отображался после загрузки процессора, поэтому я настраиваю свой скрипт 3top следующим образом:

    #!/bin/bash

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

    echo "$out%"

    Я перенаправил весь вывод цепочки команд (связанных через каналы) в переменную. Затем я просто печатаю его с помощью echo и добавляю «%» в конце, так как загрузка процессора - последнее поле

  9. На данный момент у меня есть пакетный скрипт, который принимает PID в качестве аргумента и печатает статистику один раз. Хотите мониторинг в реальном времени вместо этого? Это легко, потому что часы могут это сделать! Запустите скрипт так:

    $ watch -n 1 3top 2569

    Он будет осуществлять мониторинг в режиме реального времени, выполняя 3top один раз в секунду.


11
Пользователь на OS X и не имеет Gnu top. неверный параметр или синтаксис: -b . Не знаю, почему за это неоднократно проголосовали.
Даниэль Бек

5
Gnu top(in procps) не может быть установлен с помощью Homebrew, MacPorts или Fink и не может быть скомпилирован из источника с использованием либо, makeлибо cc top.c.
Даниэль Бек

2

Формат topотображения настраивается, но нет способа указать параметры отображения в командной строке. Однако, если вы изобретательны, вы можете делать то, что вам нужно, умело манипулируя ~/.toprcфайлом.

Предполагая, что вы еще не настроили отображение top(и не имеете ~/.toprcфайла):

  1. Launch top.
  2. Нажмите fдля входа в режим выбора поля.
  3. Для каждого поля, *рядом с которым вы не хотите, нажмите соответствующую букву, чтобы отменить выбор этого поля. Например, нажмите, eчтобы отменить выбор User Nameполя. Когда вы закончите, вы должны иметь только *рядом Process Id, CPU usageи Command name/line.
  4. Нажмите, Spaceчтобы вернуться в главное окно.
  5. Нажмите W(т.е. Shift+ w), чтобы сохранить текущий макет в ~/.toprcфайл.
  6. Выйдите top, затем снова запустите, чтобы убедиться, что ваши настройки сохранены.
  7. Если вы хотите вернуться к макету по умолчанию, переименуйте ~/.toprcв что-то вроде ~/min.toprcперед запуском top. Если вы хотите переключиться на минимальный макет, переименуйте ~/min.toprcобратно ~/.toprcдо запуска top.

Это переименование и запуск файла, topвероятно, может быть преобразован в простой сценарий оболочки кем-то, у кого больше опыта и знаний, чем у меня. Вам понадобится особое внимание, если ваш обычный topмакет уже был настроен.


Можно ли добавить фильтр (даже если вручную) .toprc? Мне нравится добавлять фильтр RUID>999при запуске.
Доктор Беко
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.