尝试通过简单的过程解释来解决我的脚本,因为我是 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 测试)