如何让“ps”命令以 MB 而不是 KB 显示内存?

bal*_*lki 26 size ps

Linuxps命令显示了不同的内存使用情况,例如 RSS(常驻集大小),默认情况下以 kB 为单位的大小。有没有办法像 MB 或 GB 一样显示ls -s --human-readable

Dev*_*laN 28

AFAIK 你不能简单地通过ps带有选项的纯命令来实现它。但是,您可以使用一些文本处理器,awk并使其按照您的意愿行事:

ps afu | awk 'NR>1 {$5=int($5/1024)"M";}{ print;}'
Run Code Online (Sandbox Code Playgroud)

这需要结果ps,然后对于除第一行之外的每一行,它替换通常以 KB 为单位的第 5 列,以 MB 添加 M 后缀。

您可以将其设为别名并将其存储在.bashrc文件中,以便您可以通过类似.bashrc 的名称调用它myps

大多数人都在问如何保留格式或使用其他单位和精度。

对于简单版本,您可以使用column -t输出过滤器:

ps afu | awk 'NR>1 {$5=int($5/1024)"M";}{ print;}' | column -t
Run Code Online (Sandbox Code Playgroud)

然而,这不能正确识别最后一列中的空格。不幸的是,我们必须处理文本格式并以printf类似格式准备我们自己的格式字符串。

ps afu | awk 'NR==1 {o=$0; a=match($0,$11);}; NR>1 {o=$0;$5=int(10*$5/1024)/10"M";}{ printf "%-8s %6s %-5s %-5s %9s %9s %-8s %-4s %-6s %-5s %s\n", $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, substr(o, a);}'
Run Code Online (Sandbox Code Playgroud)

解释:

  • NR==1条件仅适用于第一行(标题)。我们使用原始 ps 输出来确定 COMMAND 的起始位置:
    • o=$0 存储未修改的整行,以便我们稍后使用
    • a=match($0,$11) 找到第 11 个字段的位置(应该是 COMMAND 列在原始输出中的起始位置)
  • NR>1用于以下行(数据)。我们正在更改第 5 个字段:
    • $5=int(10*$5/1024)/10"M" 将值更改为带一位小数的兆字节并添加“M”后缀。
    • printf 以列式风格显示所有字段:
      • %-10s表示s字符串,1010 个字符宽,-左对齐
      • %8s表示s用于字符串,8用于 8 个字符宽,并且由于-该字段没有输出是右对齐的。
    • substr(o, a)oa先前条件计算的位置开始获取原始行的子字符串(因此存储在之前),因此我们可以显示命令输出并保留空格。

  • 修改为 GB 并保留 2 个小数位(例如`1.23GB`):`ps aux | awk '{$5=int(100 * $5/1024/1024)/100"GB";}{打印;}'` (5认同)
  • 是否有可能实现相同的目标,同时保留 `ps` 格式?标签被`awk`完全剥离 (2认同)

Kro*_*nos 7

我来这里寻找同样问题的解决方案。令人惊讶的是,目前还没有更好的答案。我根据这个线程和我在网上读到的其他页面创建了自己的稍微灵活的修复程序。

为了使内容更具可读性,我制作了一个自动范围功能并将其用于vszrss字段。

另外,看起来实际上 一种方法可以强制在 上使用任意字段分隔符ps。我是这样做的:

我在使用位于联机帮助页子标题中的字段描述符时发现了一个明显未记录的AIX FORMAT DESCRIPTORS技巧ps。看起来,当您执行诸如USER 或VSZ 之类的%操作时,它将在每个输出行之前包含任何字符。我想知道如果我尝试的话会发生什么。每行都显示一个。好的,不带空格的任意字符串怎么样?是的!!显然你必须在字符串中才能让事情按预期进行。不明白。请注意,它将尝试解析 后面的所有内容以查看其是否是有效的字段描述符。因此,将其保留在字符串末尾可能是最安全的,以避免出现问题。%U%z%%%%%%ps%FOOBARBIGSTRINGBLABLA%%

现在我只需要想出一个字符串,该字符串成为有效数据一部分的可能性相对较低 - 特别是当我用作cmd字段时。zzz:::zzz似乎不太可能。让我们在末尾添加额外的内容%%即可使其正常工作 -zzz:::zzz%%这在输出中显示为zzz:::zzz%.

awk我处理可以处理多字符字段分隔符的输出,告诉awk查找zzz:::zzz%作为字段分隔符。

|head -n20最后|cut -c -250是将输出限制为 20 行,并在 250 个字符后剪切每行,以保持终端的整洁。出于实际的脚本编写目的,您可能希望删除它们。

编辑: 我添加了一个变量来指出您还可以使用这些示例按任何字段进行排序。字段的名称可以在ps标题下的联机帮助页中找到STANDARD FORMAT SPECIFIERS

编辑2: 根据要求,我添加了关于任意字段分隔符如何工作以及我选择字段分隔符的推理的更深入的解释。

实施例1

sortbyfield="rss"; fsep="-o zzz:::zzz%% -o"; ps ax o user:16 $fsep pid $fsep pcpu $fsep pmem $fsep vsz $fsep rss $fsep tty $fsep stat $fsep lstart $fsep time:16 $fsep cmd  --sort -$sortbyfield | awk 'function setprefix(num){{n_suffix=1; while(num > 1000 && n_suffix < suffixes_len) {num /= 1024; n_suffix++;}; num=int(100*num)/100suffixes[n_suffix]}; return num} BEGIN{suffixes_len=split("kB MB GB TB PB EB ZB",suffixes);FS="zzz:::zzz%";} NR>1 {$5=setprefix($5);$6=setprefix($6); }{ printf "%-16s %6s %-5s %-5s %9s %9s %-8s %-8s %-25s %-18s %s\n", $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11;}' |head -n20 |cut -c -250
Run Code Online (Sandbox Code Playgroud)

输出:(稍微净化过的示例)

USER                PID %CPU  %MEM        VSZ       RSS TT       STAT                      STARTED              TIME   CMD
gdm                1474  0.0   0.3     2.87GB  182.86MB tty1     Sl+      Sat Jun 18 01:31:44 2022          00:34:40   /usr/bin/gnome-shell
gdm                1370  0.0   0.0    171.3MB   34.31MB tty1     Sl+      Sat Jun 18 01:31:43 2022          00:01:56   /usr/libexec/Xorg vt1 -displayfd 3 -auth /run/user/42/gdm/Xauthority -background none -noreset -keeptty -verbose 3
gdm                1552  0.0   0.0   686.07MB   20.14MB tty1     Sl+      Sat Jun 18 01:31:46 2022          00:00:40   /usr/libexec/gsd-color
gdm                1577  0.0   0.0   870.49MB   19.53MB tty1     Sl+      Sat Jun 18 01:31:46 2022          00:00:01   /usr/libexec/gsd-media-keys
gdm                1538  0.0   0.0   531.81MB   18.51MB tty1     Sl+      Sat Jun 18 01:31:46 2022          00:00:00   /usr/libexec/gsd-xsettings
gdm                1541  0.0   0.0   539.53MB    18.5MB tty1     Sl+      Sat Jun 18 01:31:46 2022          00:00:04   /usr/libexec/gsd-power
gdm                1570  0.0   0.0    458.5MB    18.4MB tty1     Sl+      Sat Jun 18 01:31:46 2022          00:00:00   /usr/libexec/gsd-wacom
gdm                1500  0.0   0.0   386.57MB   17.94MB tty1     Sl       Sat Jun 18 01:31:45 2022          00:00:00   /usr/libexec/ibus-x11 --kill-daemon
gdm                1537  0.0   0.0   386.13MB   17.92MB tty1     Sl+      Sat Jun 18 01:31:46 2022          00:00:00   /usr/libexec/gsd-clipboard
Run Code Online (Sandbox Code Playgroud)

实施例2

稍微简洁的版本:

sortbyfield="rss"; fsep="-o zzz:::zzz%% -o"; ps ax o user:16 $fsep pid $fsep pcpu $fsep pmem $fsep vsz $fsep rss $fsep tty $fsep stat $fsep lstart $fsep time:16 $fsep comm  --sort -$sortbyfield | awk 'function setprefix(num){{n_suffix=1; while(num > 1000 && n_suffix < suffixes_len) {num /= 1024; n_suffix++;}; num=int(100*num)/100suffixes[n_suffix]}; return num} BEGIN{suffixes_len=split("kB MB GB TB PB EB ZB",suffixes);FS="zzz:::zzz%";} NR>1 {$5=setprefix($5);$6=setprefix($6); }{ printf "%-16s %6s %-5s %-5s %9s %9s %-8s %-8s %-25s %-18s %s\n", $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11;}' |head -n20 |cut -c -250
Run Code Online (Sandbox Code Playgroud)

输出:(稍微净化过的示例)

USER                PID %CPU  %MEM        VSZ       RSS TT       STAT                      STARTED              TIME   COMMAND
gdm                1474  0.0   0.3     2.87GB  182.86MB tty1     Sl+      Sat Jun 18 01:31:44 2022          00:34:40   gnome-shell
gdm                1370  0.0   0.0    171.3MB   34.31MB tty1     Sl+      Sat Jun 18 01:31:43 2022          00:01:56   Xorg
gdm                1552  0.0   0.0   686.07MB   20.14MB tty1     Sl+      Sat Jun 18 01:31:46 2022          00:00:40   gsd-color
gdm                1577  0.0   0.0   870.49MB   19.53MB tty1     Sl+      Sat Jun 18 01:31:46 2022          00:00:01   gsd-media-keys
gdm                1538  0.0   0.0   531.81MB   18.51MB tty1     Sl+      Sat Jun 18 01:31:46 2022          00:00:00   gsd-xsettings
gdm                1541  0.0   0.0   539.53MB    18.5MB tty1     Sl+      Sat Jun 18 01:31:46 2022          00:00:04   gsd-power
gdm                1570  0.0   0.0    458.5MB    18.4MB tty1     Sl+      Sat Jun 18 01:31:46 2022          00:00:00   gsd-wacom
gdm                1500  0.0   0.0   386.57MB   17.94MB tty1     Sl       Sat Jun 18 01:31:45 2022          00:00:00   ibus-x11
gdm                1537  0.0   0.0   386.13MB   17.92MB tty1     Sl+      Sat Jun 18 01:31:46 2022          00:00:00   gsd-clipboard
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助那里的人!

  • (1) 我们不会为一行中的大多数角色提供奖励积分。请将脚本格式化为多行,以避免水平滚动。(2) 看来您选择了 `zzz::zzz` 作为任意字符串,但 `%` 部分很特殊。请解释这是如何工作的。……………………请勿在评论中回复;[编辑]您的答案,使其更清晰、更完整。 (2认同)
  • 我不确定如何分解代码并仍然使其有意义。我正在做的一些事情实在是太漫长了。你有什么建议? (2认同)