Фільтрація верхнього командного виводу


12

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

Після отримання PID процесу, я запускаю:

top -pid 1234

Однак це відображає більше 15 стовпців для цього процесу. Чи можу я передати висновок команди 'для пробудження та відображення лише:

PID COMMAND %CPU

стовпчики?

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

Відповіді:


8
top -pid 3907 -stats "pid,command,cpu"
  • -pid 3907: ваш ідентифікатор процесу
  • -stats pid,command,cpu: показувати лише ідентифікатор процесу, ім’я та% 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 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 число Вказує максимальну кількість повторень або кадрів, які слід створити до завершення.

    Це скоригована верхня команда, яка друкує вихід лише один раз, а потім виходить:

    $ 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. Я підкажу цей рядок, щоб витягти лише потрібні мені стовпці:

    $ 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}'

    Щоб зробити статистику 3-го відображення щодо 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. Запуск 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.