Назад | Перейти на главную страницу

Ограничьте TOP конкретными процессами (без статических PID)

Я хотел бы отслеживать конкретные процессы через TOP на наших серверах приложений через TOP. В настоящее время я использую в BASH следующее для отслеживания только тех процессов, которые меня интересуют:

top -p $(pgrep PSAPPSRV | tr "\\n" "," | sed 's/,$//')

Я думал, что это отличное решение, но я упустил два предостережения:

  1. Один процесс может перерабатывать сам себя, создавая новый PID
  2. Когда существующие процессы находятся под нагрузкой, сервер может порождать новые процессы, чтобы справиться с нагрузкой.

Обе ситуации означают, что я не могу отслеживать процессы в течение длительного времени, если я использую «моментальный снимок» PID в момент времени, когда я запускаю указанную выше команду.

Эти процессы выполняются от имени специального пользователя. Однако этот пользователь запускает все процессы, связанные с сервером приложений. И сервер приложений может состоять из 30 процессов, но меня интересует только конкретный процесс.

Можно ли передать новые PID в уже работающий вывод TOP?

Или лучше всего будет повторно вызывать TOP через определенные промежутки времени, передавая идентификаторы PID в это время?

top на самом деле не предназначен для того, что вы пытаетесь сделать (на самом деле, некоторые версии top даже не поддерживай -p вариант).

Лучший вариант, который я могу придумать для вашей ситуации, - это обернуть top в скрипте, который вызывает его многократно с -d и -n варианты, например

#!/bin/sh
while [ true ]; do
    clear
    top -d1 -n15 -p $(pgrep PSAPPSRV | tr "\\n" "," | sed 's/,$//')
    sleep 1
done

что сделает top показать один экран с 15 процессами, засыпать на одну секунду, затем повторить (пока вы не прервете сценарий с помощью CTRL+C.

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