Это должно делать то, что вам нужно. Он получает информацию /proc/$PID/statm
и печатает (с man procfs
):
size total program size
(same as VmSize in /proc/[pid]/status)
resident resident set size
(same as VmRSS in /proc/[pid]/status)
share shared pages (from shared mappings)
data data + stack
Сценарий:
#!/usr/bin/env bash
## Print header
echo -e "Size\tResid.\tShared\tData\t%"
while [ 1 ]; do
## Get the PID of the process name given as argument 1
pidno=`pgrep $1`
## If the process is running, print the memory usage
if [ -e /proc/$pidno/statm ]; then
## Get the memory info
m=`awk '{OFS="\t";print $1,$2,$3,$6}' /proc/$pidno/statm`
## Get the memory percentage
perc=`top -bd .10 -p $pidno -n 1 | grep $pidno | gawk '{print \$10}'`
## print the results
echo -e "$m\t$perc";
## If the process is not running
else
echo "$1 is not running";
fi
done
Затем вы можете вызвать скрипт, присвоив ему имя процесса в качестве ввода. Например:
$ memusage.sh firefox
Size Resid. Shared Data %
517193 261902 9546 400715 12.8
517193 261902 9546 400715 12.8
517193 261902 9546 400715 12.8
517193 262100 9546 400715 12.8
517193 262100 9546 400715 12.8
517193 262100 9546 400715 12.8
517209 261899 9546 400731 12.8
517209 261899 9546 400731 12.8
ПРИМЕЧАНИЯ:
- Это предполагает, что существует только один запущенный процесс с указанным именем.
/proc/$PID/statm
), а затем поспать 100 мс и повторить. Почему вы не можете просто продолжать бросать ПИД - ассоциированныйstatm
черезcat
, возможно , использовать некоторое регулярное выражение для фильтра от дополнительных / ненужных значений, и просто сделатьsleep 0.01
? Некоторые операционные системы не допускаютsleep
значения менее секунды , поэтому в этом случае вам придется выбрать маршрут Python (иtime
вместо этого использовать встроенную библиотеку Python для сна).