Answers:
top -pid 3907 -stats "pid,command,cpu"
-pid 3907
:您的进程ID-stats pid,command,cpu
:仅显示进程ID,名称和CPU%无需awk
在输出上运行。
如果要对输出进行后处理,请使用-l 0
来以日志记录模式运行(0表示无限期,其他所有条件均会限制样本数量)。输出将如下所示(两个重复):
Processes: 72 total, 3 running, 1 stuck, 68 sleeping, 326 threads
2011/05/10 19:15:13
Load Avg: 0.14, 0.14, 0.09
CPU usage: 20.0% user, 26.66% sys, 53.33% idle
SharedLibs: 5304K resident, 5208K data, 0B linkedit.
MemRegions: 16345 total, 1048M resident, 54M private, 338M shared.
PhysMem: 726M wired, 1802M active, 687M inactive, 3215M used, 750M free.
VM: 169G vsize, 1036M framework vsize, 5261732(0) pageins, 552476(0) pageouts.
Networks: packets: 46747406/52G in, 32528901/3715M out.
Disks: 9452898/244G read, 11226269/293G written.
PID COMMAND %CPU
3907 WindowServer 0.0
Processes: 72 total, 3 running, 1 stuck, 68 sleeping, 326 threads
2011/05/10 19:15:14
Load Avg: 0.13, 0.14, 0.09
CPU usage: 0.95% user, 1.90% sys, 97.14% idle
SharedLibs: 5304K resident, 5208K data, 0B linkedit.
MemRegions: 16346 total, 906M resident, 54M private, 386M shared.
PhysMem: 726M wired, 1802M active, 687M inactive, 3215M used, 751M free.
VM: 169G vsize, 1036M framework vsize, 5261732(0) pageins, 552476(0) pageouts.
Networks: packets: 46747406/52G in, 32528901/3715M out.
Disks: 9452898/244G read, 11226269/293G written.
PID COMMAND %CPU
3907 WindowServer 2.7
使用awk
或类似的工具仅显示第13行(因为这些行包含该示例中的值):
$ top -l 0 -pid 3907 -stats pid,command,cpu | awk 'NR%13==0'
3907 WindowServer 0.0
3907 WindowServer 1.3
3907 WindowServer 2.2
top
与Linux 有所不同。
当然可以做到,我将解释我将如何做。我不假装这是一种最佳方法,但确实可以做到。我正在使用Linux(和bash shell),因此top的默认行为可能会略有不同。因此,您可能需要针对特定情况调整此微型操作方法。
只需运行top,不带任何参数:
$ top
这是我的输出中的标题和相关行:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2569 user 20 0 339m 86m 10m S 7.8 6.9 6:42.99 java
我选择了一个在内存中保留一段时间并实际上消耗CPU的进程,我将使用它作为达到最终目标的测试过程。
默认情况下,top以交互模式运行。这不适合我,我想捕获相关数据并打印出来。之后,我将处理以交互方式显示数据的任务。热门手册中的相关报价:
-b:批处理模式操作以“批处理模式”开头,这对于从顶部向其他程序或文件发送输出很有用。在此模式下,top将不接受输入并运行,直到使用“ -n”命令行选项设置的迭代限制或终止为止。
-n:迭代次数限制为:-n number指定top在结束之前应该产生的最大迭代次数或帧。
这是调整后的top命令,仅输出一次,然后退出:
$ top -b -n 1
我知道我想观看的PID,因此我将在顶部再添加一个限制,因此它仅打印有关该过程的数据:
$ top -b -n 1 -p 2569
即使在批处理模式下,top仍会打印一个标头,其中包含杂项系统范围的统计信息,例如正常运行时间,可用内存/交换等。我不需要此信息。我只需要一行-包含有关我的过程数据的那一行,因此我将像这样从整个输出中删除它:
$ top -b -n 1 -p 2569 | tail -n 2 | head -n 1
如您所见,我从1得到第二行。
我会将这条线通过管道发送到awk以仅提取我需要的列:
$ top -b -n 1 -p 2569 | tail -n 2 | head -n 1 | awk '{print $1, $12, $9}'
到目前为止,我一直在命令行中进行这些操作,现在是时候为我们的硬编码特殊情况添加一些持久性和灵活性。我将整行代码移动到一个简单的shell脚本中。我将其命名为3top,因为该名称将在以后使用,所以会强调该名称:
#!/bin/bash
top -b -n 1 -p 2569 | tail -n 2 | head -n 1 | awk '{print $1, $12, $9}'
PID号是硬编码的,这是使脚本将其接受为命令行参数的方法:
#!/bin/bash
top -b -n 1 -p "$1" | tail -n 2 | head -n 1 | awk '{print $1, $12, $9}'
要使3top显示有关PID 2569的统计信息,必须像这样调用它:
$ ./3top 2569
我还希望在CPU负载后显示百分比,因此我正在像这样调整3top脚本:
#!/bin/bash
out=$(top -b -n 1 -p "$1" | tail -n 2 | head -n 1 | awk '{print $1, $12, $9}')
echo "$out%"
我已将命令链(通过管道连接)的整个输出重定向到一个变量中。然后,我仅使用echo进行打印,并在最后添加“%”,因为CPU负载是最后一个字段
至此,我有了一个批处理脚本,该脚本接受PID作为参数并打印一次统计信息。需要实时监控吗?很简单,因为手表可以做到!像这样运行脚本:
$ watch -n 1 3top 2569
它将通过每秒运行3top进行实时监视。
top
。无效的选项或语法:-b。不知道为什么一再被否决。
top
(in procps
)无法使用Homebrew,MacPorts或Fink安装,也无法使用make
或从源代码进行编译cc top.c
。
该top
显示格式是可定制的,但没有指定在命令行显示选项的方式。但是,如果您具有创造力,则可以通过巧妙地处理~/.toprc
文件来完成所需的工作。
假设您尚未自定义的显示top
(并且没有~/.toprc
文件):
top
。*
不需要的下一个字段,请按相应的字母以取消选择该字段。例如,按e取消选择该User Name
字段。当你做,你应该只有一个*
旁边Process Id
,CPU usage
和Command name/line
。~/.toprc
文件中。top
,然后重新启动以确认您的设置已保存。~/.toprc
为。如果要切换到最小布局,请在启动前重命名为。~/min.toprc
top
~/min.toprc
~/.toprc
top
重命名和启动该文件的top
人员可能比我拥有更多的经验和知识,可以将其改成简单的shell脚本。如果您的常规top
布局已自定义,则需要特别注意。
.toprc
?我喜欢RUID>999
在启动时添加过滤器。
# top -p1 -stats "pid,command,cpu" top: unknown option 't'