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

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

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

 top -pid 1234 

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

 PID COMMAND %CPU 

столбцы?

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

 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 

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

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

    $ 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. По умолчанию верхние запуски выполняются в интерактивном режиме. Это меня не устраивает, я хочу захватить соответствующие данные и распечатать их. После этого я обработаю задачу отображения данных в интерактивном режиме. Релевантные цитаты из верхней страницы:

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

    -n: Число ограничений итераций как: -n number Указывает максимальное количество итераций или кадров, верхние должны выдавать до окончания.

    Это скорректированная верхняя команда, которая выводит вывод только один раз, а затем выходит:

    $ top -b -n 1

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

    $ top -b -n 1 -p 2569

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

    $ 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%"

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

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

    $ watch -n 1 3top 2569

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

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

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

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

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

Давайте будем гением компьютера.