实施例1

实施例1

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

答案1

AFAIK 你不能简单地通过ps带有选项的纯命令来实现它。但是,您可以使用一些文本处理器,例如awk并使其执行您想要的操作:

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

这会从 中获取结果ps,然后对于除了第一行之外的每一行,它会替换通常以 KB 为单位的第五列,然后添加 M 后缀到 MB。

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

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

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

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

然而,这不能正确识别最后一列中的空格。不幸的是,我们必须处理文本格式并以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);}'

解释:

  • 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字符串,10宽度为 10 个字符,-左对齐
      • %8s表示s字符串,88 个字符宽,并且由于没有-输出,因此该字段是右对齐的。
    • substr(o, a)o从先前条件计算的位置开始获取原始行(因此之前存储)的子字符串a,因此我们可以在保留空格的情况下显示命令输出。

答案2

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

为了使内容更具可读性,我制作了一个自动范围功能并将其用于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

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

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

实施例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

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

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

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

相关内容