Вы должны быть в состоянии сделать это, используя стандартную команду ps
. От man ps
:
%mem %MEM ratio of the process's resident set size to the physical
memory on the machine, expressed as a percentage.
rss RSS resident set size, the non-swapped physical memory that
a task has used (inkiloBytes).
vsz VSZ virtual memory size of the process in KiB (1024byte units).
Device mappings are currently excluded; this is subject
to change.
Единственное, что вам нужно, это PID вашего процесса. Итак, если ваше приложение называется myApp, вы можете получить PID следующим образом:
ps x | grep myApp
Который печатает список как это:
15909 pts/3 S 0:37 myApp
22583 pts/6 S+ 0:00 grep --color myApp
Первый столбец - это идентификатор процесса (PID). Теперь, если вы хотите автоматизировать это, вам нужно пропустить строку, содержащую команду grep, и сохранить вывод в переменной BASH:
pid=$(ps x | grep myApp | grep -v grep | awk '{print $1}')
Часть awk
заставляет команду печатать только 1-е поле, PID.
Вы можете собрать все это в один слой, который каждую минуту будет экономить использование памяти вашего приложения, в файл с именем memlog.txt
:
while sleep 60; do \
pid=$(ps x | grep myApp | grep -v grep | awk '{print $1}') && \
ps xo pid,rss,vsz,%mem | grep "$pid" >> memlog.txt ; \
done
while sleep 60
заставляет bash работать в бесконечном цикле, ожидая 60 сек между циклами
sleep 60
говорит ему ждать 60 секунд. Измените это значение, если оно требуется для более частого обновления.
В результате получается файл (memlog.txt
) с четырьмя столбцами: PID вашего приложения, размер резидентного набора, размер виртуальной памяти и процент памяти. Например:
4166 25240 633028 0.3
4166 25240 633028 0.3
4166 25240 633028 0.3
Это может быть легко расширено, чтобы включить использование процессора и время для каждого измерения. Например, чтобы включить время:
while sleep 60; do \
date=$(date +%D" "%H:%M:%S);
echo -n "$date : " >> memlog.txt;
pid=$(ps x | grep myApp | grep -v grep | awk '{print $1}') && \
ps xo pid,rss,vsz,%mem | grep "$pid" >> memlog.txt; \
done