简化 top 中的命令

简化 top 中的命令

我正在使用以下命令来收集子 PID 的信息:

top -b -n1 -p 719011,719012,719013,719014,719015,719016,719017 | sed -e 's/USER/----/' -e 's/root/----/' -e 's/PR/--/' -e 's/20/--/' -e 's/VIRT/----/' -e 's/538m/----/' -e 's/RES/---/' -e 's/12m/---/' -e 's/SHR/---/' -e 's/1348/----/' -e 's/NI/--/' -e 's/S/-/' | tail -9 > file1

它工作得很好,但有点冗长!我想知道是否有办法仅使用 pPID 来收集信息?这样就不必输入每个子进程 ID。我不想要完整的答案,只想得到正确方向的指示,这样我就可以自己弄清楚了!

好的,我已将命令整理为:

ps -o pid= --ppid 719008 | top -b -n4 | awk '{print $1,$9,$10,$12}' | tail -9 > file

但是,我得到的不是子进程的输出,而是系统上每个进程的输出!我遗漏了什么?

$ pstree -p 719008
dvaudio_server(719008)─┬─{dvaudio_server}(719011)
                       ├─{dvaudio_server}(719012)
                       ├─{dvaudio_server}(719013)
                       ├─{dvaudio_server}(719014)
                       ├─{dvaudio_server}(719015)
                       ├─{dvaudio_server}(719016)
                       └─{dvaudio_server}(719017)

输出为pgrep

pgrep: option requires an argument -- 'd'
Usage: pgrep [-flvx] [-d DELIM] [-n|-o] [-P PPIDLIST] [-g PGRPLIST] [-s SIDLIST]
    [-u EUIDLIST] [-U UIDLIST] [-G GIDLIST] [-t TERMLIST] [PATTERN]

答案1

您可以使用以下方式获取进程的直接子进程pgrep

-P, --parent ppid,...
      Only match processes whose parent process ID is listed.

和:

-d, --delimiter delimiter
      Sets  the  string  used to delimit each process ID in the output
      (by default a newline).  (pgrep only.)

所以:

top ... -p $(pgrep -P <PPID> -d,) | ...

答案2

您可以使用ps显示进程列表。它理解--ppid PPIDLIST允许您通过逗号分隔的父进程 ID 列表过滤进程的参数。

man ps

--ppid pidlist

Select by parent process ID. This selects the processes with a parent process ID in pidlist. 
That is, it selects processes that are children of those listed in pidlist. 

所以你应该尝试类似

ps aux --ppid 12345

相关内容