计算内存的脚本

计算内存的脚本

尝试通过简单的过程解释来解决我的脚本,因为我是 Linux 新手,我可能做错了什么

创建一个 memory.sh 脚本来计算 Firefox 的内存使用情况(占总内存的百分比)

1. 列出进程及其内存使用情况(以百分比表示)

ps -e -o pmem,args |

2. 在此列表中搜索包含单词 firefox 的行

ps -e -o pmem,args | grep -i firefox

3. 仅使用显示内存使用情况的列

ps -e -o pmem,args | grep -i firefox | grep -v grep

4. 通过添加 + 显示列表中的每个项目

5.在列表末尾添加0

6.另起一行添加退出

7. 进行计算

答案1

在 GNU/Linux 上并使用zsh

printf 'Total: %.3g%%\n' ${(j[+])${(f)"$(
  pgrep -f firefox | LC_ALL=C xargs -r ps -o pmem=
)"}}

在哪里:

  • pgrep -f firefox报告 arg 列表包含的进程的 pidfirefox
  • xargs -r将那些(如果有的话)作为参数传递给ps
  • ps -o pmem=输出内存使用百分比(采用英文格式,并.带有十进制基数字符,LC_ALL=C以便面向未来)。
  • "$(...)"捕获ps输出,由于引用而禁用 IFS 分割。
  • ${(f)...}相反,将其拆分为换行符。
  • ${(j[+])...}将结果单词与+
  • $(( ... ))结果被解释为算术表达式
  • printf 'Total: %.3g%%\n'并以默认的 3 位精度打印。

现在请注意,pmem后面仅用一位数字表示.。因此,对于单独使用很少内存的进程来说,这会给你带来非常差的精度。例如,在具有 4GiB 的系统上使用 100KiB 或 2MiB 的进程将同样被视为使用 0.0% 内存,其中 200 个使用 2MiB 的进程将使用 400MiB,因此为 10%,但上面计算的总和将为您提供 0。

为了获得更好的精度,您应该计算rss所有过程的累积并通过以下方式进行计算hand

pattern=firefox
used=$((
  ${(j[+])${(f)"$(
    pgrep -f -- "$pattern" | LC_ALL=C xargs -r ps -o rss=
  )"}}
))
grep '^MemTotal:' /proc/meminfo | read x total x
printf 'Total: %.3g%%\n' 'used * 100. / total'

答案2

尝试一下,它或多或少地遵循您的格式说明(没有任何输出格式示例,很难猜测你到底期望什么):

$ \ps -eo pmem,args | awk '/[Ff]irefox/ {totmem+=$1;printf "%s+", $1} 
                           END{printf "%s%2.1f%s\n", "0=",totmem,"%"}'
4.0+0.3+0.8+1.1+1.2+1.0+1.0+0.5+0.5+0.5+0=10.9%     # example output w/o the one liner's own memory consumption

但您也可以直接生成总数:

$ \ps -eo pmem,args | awk '/[Ff]irefox/ {totmem+=$1}
                           END{print "total memory used:",totmem,"%"}'
total memory used: 10.9 %         # example output

(使用 GNU Awk 5.1.1 测试)

相关内容