Фильтрация по имени процесса и регистрации использования ЦП

Есть ли опция для команды linux top, где я могу фильтровать процессы по имени и записывать использование CPU этим процессом каждые 1 секунду в файл журнала?

Ответ 1

Чтобы отфильтровать вывод top по имени процесса, вы можете использовать pgrep, чтобы получить список PID по имени процесса, затем передать их в опцию -p top. Например:

top -p $(pgrep -d',' http)

Примечание. Параметр -d',' ограничивает PID запятыми, что и ожидалось top -p. Примечание 2: top вернет сообщение об ошибке, если нет запущенных процессов, которые соответствуют имени, указанному в pgrep.

Чтобы записать результаты top в файл, используйте параметр -n 1 (только одну итерацию) и перенаправьте вывод в файл журнала.

top -p $(pgrep -d',' http) -n 1 >> your_log_file

Чтобы сделать это каждую секунду, возможно ли цикл while с sleep?

while :; do top -p $(pgrep -d',' http) -n 1 >> your_log_file; sleep 1; done

Чтобы отметить каждую запись, вы можете добавить вывод date. Например.

while :; do top -p $(pgrep -d',' http) -n 1 >> log.txt; date >> log.txt; sleep 1; done

Ответ 2

Другой вариант:

top -b -d 1 -p $(pgrep -d',' java) -n 120 > log.txt
  • Параметр -d позволяет установить частоту, используемую сверху, для обновления данные.
  • Опция -b означает, что традиционный интерфейс вершины не используется. Вместо этого он отправляет все на стандартный вывод, а затем вы можете использовать канал (|) или перенаправление ( > ).
  • Опция -n сообщает о количестве итераций, которые должен выполнить верх.

После этого вы можете ввести:

cat log.txt | grep USER_OF_PROCESS

Вы увидите время выполнения процесса, а также% CPU, Memory и все такое.

Ответ 3

#You can run following script as ./cpurecorder.sh pid filename
#It will generate output file with memory usage and cpu utilisation.
#You can log other variable by searching man for ps.

`enter code here`filepath=/home/rtcsadm              # modify as desired
interval=20                         # reports per minute
timelimit=6000                      # how long to run, in seconds

mydate=`date "+%H:%M:%S"`           # the timestamp
freq=$((60/$interval))              # for sleep function

while [ "$SECONDS" -le "$timelimit" ] ; do
  ps -p$1 -opid -opcpu -opmem -ocomm -c | grep $1 | sed "s/^/$mydate /" >> $filepath/$2.txt
  sleep 3
  mydate=`date "+%H:%M:%S"`
done