linux - 打印顶部输出的第二帧

标签 linux bash

当我执行没有任何标志的“top”命令时,我得到了

something like this大约有十几个进程使用至少 0.1% 的内存和 CPU。

当我使用设置为每分钟运行一次的 cronjob 将此打印到一个文件时,它会执行下面的命令,但是,我只得到两个或三个进程使用超过 0.1% 的内存和 CPU。

cronjob 执行这个命令:

顶部 -b -n 1 | sed -n '8,17p' | sed 's/^ *//' | tr -s ' ' | sed 的//", "/g ; s/^/{"/g ; s/$/"},/g ; 1秒/^/[/; $s/.$/]/; s/"/"pid": "/1 ; s/"/"用户": "/5 ; s/"/"pr": "/9 ; s/"/"ni": "/13 ; s/"/"virt": "/17 ; s/"/"res": "/21 ; s/"/"shr": "/25 ; s/"/"s": "/29 ; s/"/"cpu": "/33 ; s/"/"内存": "/37 ; s/"/"时间": "/41 ; s/"/"命令":"/45; s/"\(-\?[0-9]\+\)"/\1/g'

它以批处理模式获取“top”的第一帧并以 JSON 格式返回它,例如像这样:

[
    {
        "pid": 7303,
        "user": "fahclie+",
        "pr": 39,
        "ni": 19,
        "virt": 255736,
        "res": 14716,
        "shr": 5556,
        "s": "S",
        "cpu": "400,9",
        "mem": "0,2",
        "time": "210:15.98",
        "command": "FahCore_a4"
    },
    {
        "pid": 1,
        "user": "root",
        "pr": 20,
        "ni": 0,
        "virt": 42040,
        "res": 4664,
        "shr": 2840,
        "s": "S",
        "cpu": "0,0",
        "mem": "0,1",
        "time": "0:01.16",
        "command": "init"
    },
    {
        "pid": 2,
        "user": "root",
        "pr": 20,
        "ni": 0,
        "virt": 0,
        "res": 0,
        "shr": 0,
        "s": "S",
        "cpu": "0,0",
        "mem": "0,0",
        "time": "0:00.00",
        "command": "kthreadd"
    },
    {
        "pid": 3,
        "user": "root",
        "pr": 20,
        "ni": 0,
        "virt": 0,
        "res": 0,
        "shr": 0,
        "s": "S",
        "cpu": "0,0",
        "mem": "0,0",
        "time": "0:00.13",
        "command": "ksoftirqd/0"
    },
    {
        "pid": 5,
        "user": "root",
        "pr": 0,
        "ni": -20,
        "virt": 0,
        "res": 0,
        "shr": 0,
        "s": "S",
        "cpu": "0,0",
        "mem": "0,0",
        "time": "0:00.00",
        "command": "kworker/0:+"
    },
    {
        "pid": 7,
        "user": "root",
        "pr": 20,
        "ni": 0,
        "virt": 0,
        "res": 0,
        "shr": 0,
        "s": "S",
        "cpu": "0,0",
        "mem": "0,0",
        "time": "0:03.58",
        "command": "rcu_sched"
    },
    {
        "pid": 8,
        "user": "root",
        "pr": 20,
        "ni": 0,
        "virt": 0,
        "res": 0,
        "shr": 0,
        "s": "S",
        "cpu": "0,0",
        "mem": "0,0",
        "time": "0:00.00",
        "command": "rcu_bh"
    },
    {
        "pid": 9,
        "user": "root",
        "pr": 20,
        "ni": 0,
        "virt": 0,
        "res": 0,
        "shr": 0,
        "s": "S",
        "cpu": "0,0",
        "mem": "0,0",
        "time": "0:01.26",
        "command": "rcuos/0"
    },
    {
        "pid": 10,
        "user": "root",
        "pr": 20,
        "ni": 0,
        "virt": 0,
        "res": 0,
        "shr": 0,
        "s": "S",
        "cpu": "0,0",
        "mem": "0,0",
        "time": "0:00.00",
        "command": "rcuob/0"
    },
    {
        "pid": 11,
        "user": "root",
        "pr": "rt",
        "ni": 0,
        "virt": 0,
        "res": 0,
        "shr": 0,
        "s": "S",
        "cpu": "0,0",
        "mem": "0,0",
        "time": "0:00.51",
        "command": "migration/0"
    }

]

注意从第三个进程开始,这些进程都没有使用超过 0.0% 的内存或 CPU。

我怀疑这是因为 top 的第一帧是正在写入的帧,而在第一帧期间,top 仍在收集进程信息。

有没有办法将第二帧打印到文件中?

最佳答案

感谢 freenode 的 #bash IRC channel 中的 jamesd,我找到了答案:

首先我们使用 top -b -n 2 返回前 2 帧。

然后我们将这些帧通过管道传输到 grep -A10 'PID USER'(10 是匹配行之后的尾随上下文行数,'PID USER' 标题行的开头),然后将此结果通过管道传递给 tail -n 10 以删除标题行。

这只显示了 top 第二帧的前 10 个进程。

10 当然可以换成所需的进程数,'PID USER' 换成您个人 顶级配置。

关于linux - 打印顶部输出的第二帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37630135/

相关文章:

php - 通过 PHP 的 cURL 上传文件到 FTP,错误是因为密码包含 '<' 字符

linux - httpd conf文件的多个文档根目录

bash - 带有 bash 的 Yaml : escaping quotes in string

linux - 在 bash 中将正在运行的函数发送到后台

bash - 如何翻转 bash 的标准输出?

mysql - 避免在从脚本运行 MySQL 的每个命令中添加用户名和密码

linux - 如何重新安装最新的cmake版本?

python - 为 ubuntu linux 编译 python,cx_python

linux - Kubernetes 节点无法在端口 80 和 443 上访问

bash - 在文本文档中查找各种字符