如何获取系统上正在运行的进程的完整表格列表(至少包含其命令名称和 PID)以供文本处理使用?

如何获取系统上正在运行的进程的完整表格列表(至少包含其命令名称和 PID)以供文本处理使用?

当我跑步时,top我看到类似这样的屏幕,

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
    654 root      20   0   25.5g 147780  70084 S   3.7   0.9  72:08.69 Xorg
   1687 me        20   0 9165008   1.4g 268488 S   1.3   8.9 163:06.01 qutebrowser
    316 root     -51   0       0      0      0 S   0.7   0.0   1:09.86 irq/51-DELL095A:00
    683 me        20   0  810360  58212  41792 S   0.7   0.4  12:35.61 picom
    702 me        20   0  246876  18032  14616 S   0.7   0.1  26:04.86 i3bar
    827 me        20   0  665528  16316   9980 S   0.7   0.1  32:41.79 conky
2874827 me        20   0 6008688 209960 123060 S   0.7   1.3   0:10.84 QtWebEngineProc
    675 me        20   0  175796  24656  15216 S   0.3   0.2   0:14.27 i3
    771 me         9 -11 1022184  21952  12056 S   0.3   0.1  82:23.43 pulseaudio

但该程序是交互式的,所以我看到屏幕随着时间的推移而变化(这没关系,因为信息确实随着时间的推移而变化)。此外,top | grep whatever似乎永远不会回来。

如果我想要该状态的快照以将其发送到文本处理实用程序怎么办?

评论建议选择top -b -n 1,但如果我将其通过管道传输到其他程序(或者,为了简单起见,如果我> some-file),我会看到它也有某种标题,

top - 21:35:47 up 5 days,  7:24,  1 user,  load average: 0.16, 0.41, 0.37
Tasks: 243 total,   1 running, 241 sleeping,   1 stopped,   0 zombie
%Cpu(s):  2.3 us,  3.1 sy,  0.0 ni, 93.8 id,  0.0 wa,  0.0 hi,  0.8 si,  0.0 st
MiB Mem :  15787.2 total,   1840.9 free,   5693.1 used,   8253.3 buff/cache
MiB Swap:  16384.0 total,  16375.2 free,      8.8 used.   6256.7 avail Mem 

如果能有一个关于所有正在运行的进程的干净的表格报告就好了,仅此而已。

我应该使用除 之外的实用程序吗top

也许是ps -e我应该追求的?


我计划使用此解决方案的场景是调试器的 PID 选择器:用户将写入进程的名称,PID 选择器将根据该名称过滤正在运行的进程列表;然后当用户选择所需的进程时,相应的PID用于附加调试器。

答案1

ps -o我在输出格式字段名称方面非常成功。 Linux 手册页早期多次提到输出说明符ps(1)

首先简单介绍一下这个EXAMPLES部分:

要使用用户定义的格式查看每个进程:
ps -eo pid、tid、类、rtprio、ni、pri、psr、pcpu、stat、wchan:14、comm
ps axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm ps -Ao pid,tt,用户,fname,tmout,f,wchan

手册页的OUTPUT FORMAT CONTROL部分包含该选项的详细信息:

-o format
用户定义的格式。 format 是空格分隔或逗号分隔列表形式的单个参数,它提供了一种指定各个输出列的方法。已识别的关键字在标准格式说明符下面的部分。标题可以重命名(ps -o pid,ruser=真实用户 -o comm=命令) 如预期的。如果所有列标题均为空 (ps -o pid= -o comm=) 那么标题行将不会被输出。

例子:

最近,我使用它作为一种轻量级方法来获取进程的驻留集大小(RAM 使用情况)以进行监视:

ps -eo pid=,rss=,comm=

输出示例:

3874689  9104 sshd
3875080  8788 sshd

替换comm=args=产生:

3874689  9104 sshd: userone [priv]
3875080  8788 sshd: usertwo [priv]

即,args生成带有参数的命令名称,这可能更符合ps.

最好详细阅读有关这些选项的手册页,包括描述STANDARD FORMAT SPECIFIERS中引用的部分-o。为了清楚起见,我没有复制上面的整个描述。尝试它们并确保您了解输出格式(包括分隔符)也是一个好主意。

其他用途:

我已将ps -othe%cpu%mem说明符以及etime, etimes, bsdstart, 和一起使用lstart。当您想要列出进程的功能ps但希望在脚本/代码中解析更简单的输出时,它会非常有用。

答案2

最终我使用了 的输出ps -e

相关内容