Есть ли опция для команды 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