如何对 ps 命令的 CPU 字段进行排序?

如何对 ps 命令的 CPU 字段进行排序?

我正在尝试创建一个小命令来查找使用最多 CPU 功率的进程。

首先,我使用ps aux > file.txt然后cut -c 16-20 file.txt | sort -n | tail -5

我得到的结果是这样的:

1.0 
2.7
8.
14.5
14.5 

所以我的问题是如何将%CPU用法和其他字段一起输出?

答案1

正确答案是:

ps --sort=-pcpu

对于前 5 名:

ps --sort=-pcpu | head -n 6

因此您可以指定列而不干扰排序。

前任:

ps -Ao user,uid,comm,pid,pcpu,tty --sort=-pcpu | head -n 6

注意 'ckujau':由from--sort支持,其他实现可能没有此选项。psprocps

答案2

对适当的字段进行排序(默认定义为空白到非空白转换),在我的例子中,它是第三个:

ps aux | sort -n -k 3

答案3

已接受的解决方案的一个烦恼是不同列的标题将包含在输出中。另一个问题是,当您使用该开关时,-x它将ps为某些程序提供完整的命令行,这些程序可以运行并在输出中成为麻烦。

例如

  1. 烦人的命令行

    萨姆 18174 7.3 3.2 1174896 259756 ? Sl Aug27 132:38 /opt/google/chrome/chrome --type=renderer --lang=en-US --force-fieldtrials=AsyncDns/AsyncDnsB/ForceCompositingMode/disable/InfiniteCache/No/OmniboxHQPReplaceHUPProhibitTrumpingInlineableResult/Standard/OmniboxSearchSuggestTrialStarted2013Q1/7 /OneClickSignIn/Standard/Prerender/PrerenderControl/SendFeedbackLinkLocation/default/Test0PercentDefault/group_01/UMA-Dynamic-Binary-Uniformity-Trial/default/UMA-Session-Randomized-Uniformity-Trial-5-Percent/group_17/UMA-Uniformity-Trial -1%/group_20/UMA-Uniformity-Trial-10-Percent/group_07/UMA-Uniformity-Trial-20-Percent/默认/UMA-Uniformity-Trial-5-Percent/group_04/UMA-Uniformity-Trial-50 -Percent/group_01/ --enable-crash-reporter=4061BD10D0DC127169CE2132BC3FF8EC,Fedora 版本 14 (Laughlin) --extension-process --renderer-print-preview --disable-webgl --disable-pepper-3d --disable-gl -多重采样--禁用加速合成--禁用加速2d-canvas--禁用加速视频解码--channel=18086.4.1423385819

    根 1764 7.7 0.3 163692 28928 tty1 Ss+ Aug21 817:49 /usr/bin/Xorg:0 -nr -verbose -auth /var/run/gdm/auth-for-gdm-fADI0V/database -nolisten tcp vt1

    ps当查看这样的输出时,Chrome 尤其会非常烦人!

  2. 输出中的标头

    $ ps auf | sort -nk 3 | head -20
    ...
    root      1741  0.0  0.0   4140   400 tty5     Ss+  Aug21   0:00 /sbin/mingetty /dev/tty5
    root      1743  0.0  0.0   4140   400 tty6     Ss+  Aug21   0:00 /sbin/mingetty /dev/tty6
    saml     13780  0.0  0.0 115088  4216 pts/13   Ss   Aug27   0:00 bash
    saml     20432  0.0  0.0   6308   400 pts/9    S+   Aug27   0:00  \_ inotifywatch -e CREATE /etc
    saml      8206  0.0  0.0 115296  1108 pts/6    Ss+  Aug21   0:03 bash
    USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
    saml     29352  0.1  0.5 661848 42960 pts/13   Sl+  17:59   0:18  \_ irb
    ...
    

    您可以在输出的第 7 行看到混合的标头。

备择方案

  1. 摆脱标题

    ps提供了一个用于禁用这些列标题显示的开关。使用起来非常简单,只需添加开关即可--no-heading

    $ ps aux --no-heading | sort -nk 3 | head -10
    68        1481  0.0  0.0  38592  2144 ?        Ssl  Aug21   0:28 hald
    68        1527  0.0  0.0  18016   672 ?        S    Aug21   0:01 /usr/libexec/hald-addon-acpi
    avahi     1333  0.0  0.0  27872  1172 ?        S    Aug21   0:01 avahi-daemon: running [grinchy.local]
    avahi     1334  0.0  0.0  27752    20 ?        S    Aug21   0:00 avahi-daemon: chroot helper
    dbus      1307  0.0  0.0  22716  1900 ?        Ss   Aug21   1:03 dbus-daemon --system
    gdm       1879  0.0  0.0 317220  2740 ?        Sl   Aug21   0:00 /usr/libexec/polkit-gnome-authentication-agent-1
    ntp       3060  0.0  0.0  32600  2152 ?        Ss   20:05   0:00 ntpd -u ntp:ntp -p /var/run/ntpd.pid -g
    root         1  0.0  0.0  19420  1004 ?        Ss   Aug21   0:01 /sbin/init
    root      1006  0.0  0.0      0     0 ?        S    Aug21   0:00 [kvm-irqfd-clean]
    root      1020  0.0  0.0      0     0 ?        S    Aug21   2:02 [kdmflush]
    

    或者像这样:

    $ ps auf --no-heading | sort -nk 3 |head -10
    root      1735  0.0  0.0   4140   400 tty2     Ss+  Aug21   0:00 /sbin/mingetty /dev/tty2
    root      1737  0.0  0.0   4140   400 tty3     Ss+  Aug21   0:00 /sbin/mingetty /dev/tty3
    root      1739  0.0  0.0   4140   400 tty4     Ss+  Aug21   0:00 /sbin/mingetty /dev/tty4
    root      1741  0.0  0.0   4140   400 tty5     Ss+  Aug21   0:00 /sbin/mingetty /dev/tty5
    root      1743  0.0  0.0   4140   400 tty6     Ss+  Aug21   0:00 /sbin/mingetty /dev/tty6
    saml     13780  0.0  0.0 115088  4216 pts/13   Ss   Aug27   0:00 bash
    saml     20432  0.0  0.0   6308   400 pts/9    S+   Aug27   0:00  \_ inotifywatch -e CREATE /etc
    saml      2098  0.0  0.0 115508  3148 pts/9    Ss   Aug22   0:05 bash
    saml     27134  0.0  0.0 115496  6768 pts/18   Ss   Aug27   0:02 bash
    saml      3248  0.0  0.0 115076  1024 pts/0    Ss+  Aug21   0:00 bash
    
  2. 控制正在显示的列。

    这看起来很痛苦,但如果您正在编写捕获ps输出的脚本,那也不算太糟糕。像这样的命令将模仿 的输出,只不过用仅显示可执行文件名称的较短版本ps aux替换列的较长形式。COMMAND

    $ ps ax --no-headings -o user,pid,%cpu,%mem,vsz,sgi_rss,tname,stat,start_time,time,ucmd
    

    将它们放在一起而无需列标题,在编写脚本时更容易处理。

    CPU 进程百分比从最高到最低的列表:

    $ ps ax --no-headings -o user,pid,%cpu,%mem,vsz,sgi_rss,tname,stat,start_time,time,ucmd |sort -nrk 3|head -10
    saml     18086  114  6.4 1418852 515236 ?     Sl   Aug27 1-10:53:31 chrome
    saml     18536 14.7  4.1 1276240 328636 ?     Sl   Aug27 04:29:21 chrome
    saml     18558 12.2  3.4 1209712 278228 ?     Sl   Aug27 03:44:22 chrome
    saml     18543 10.9  3.8 1238132 308824 ?     Rl   Aug27 03:20:18 chrome
    root      1764  7.7  0.4 170220 35276 tty1    Rs+  Aug21 13:40:16 Xorg
    saml     18174  7.3  3.0 1167728 241728 ?     Sl   Aug27 02:14:25 chrome
    saml     18314  3.6  1.4 1049020 119308 ?     Sl   Aug27 01:06:19 chrome
    saml     18528  2.7  3.1 1178368 251212 ?     Sl   Aug27 00:50:55 chrome
    saml      2389  2.0  0.1 330632 8480 ?        Sl   Aug21 03:37:13 compiz
    saml     18208  1.7  1.3 1081132 108828 ?     Sl   Aug27 00:32:02 chrome
    

    CPU 进程百分比从最低到最高的列表:

    $ ps ax --no-headings -o user,pid,%cpu,%mem,vsz,sgi_rss,tname,stat,start_time,time,ucmd |sort -nk 3|tail -10
    saml     18208  1.7  1.3 1082156 108348 ?     Sl   Aug27 00:32:03 chrome
    saml      2389  2.0  0.1 330632 8492 ?        Sl   Aug21 03:37:15 compiz
    saml     18528  2.7  3.1 1181440 250856 ?     Sl   Aug27 00:50:58 chrome
    saml     18314  3.6  1.5 1050044 119828 ?     Sl   Aug27 01:06:25 chrome
    saml     18174  7.3  3.0 1167728 242068 ?     Sl   Aug27 02:14:32 chrome
    root      1764  7.7  0.3 163688 28716 tty1    Ss+  Aug21 13:40:26 Xorg
    saml     18543 10.9  3.8 1235060 305464 ?     Sl   Aug27 03:20:32 chrome
    saml     18558 12.2  3.5 1214832 283560 ?     Sl   Aug27 03:44:34 chrome
    saml     18536 14.7  3.9 1267024 314400 ?     Sl   Aug27 04:29:39 chrome
    saml     18086  114  6.4 1412992 514856 ?     Sl   Aug27 1-10:55:28 chrome
    

答案4

在 macOS 上,您可以使用 BSD-only-r标志“按当前 CPU 使用情况排序”:

ps -aexro pcpu,cputime,pid,etime,user,args | head

还有-m按“内存使用情况”排序的标志(man ps没有说明这是否是真实或共享或私有内存)。

相关内容