如何一起使用 'top' 和 'USER' 命令

如何一起使用 'top' 和 'USER' 命令

我有一个需求,需要使用用户上下文来过滤处理结果。我正在使用类似的命令。

# top -b -n 1 -p $(pgrep -d',' http)
top - 14:44:13 up 7 days,  3:01,  6 users,  load average: 0.05, 0.01, 0.00
Tasks:   3 total,   0 running,   3 sleeping,   0 stopped,   0 zombie
Cpu(s):  1.0%us,  1.4%sy,  0.0%ni, 97.4%id,  0.1%wa,  0.0%hi,  0.1%si,  0.0%st
Mem:   8062112k total,  4471344k used,  3590768k free,   176040k buffers
Swap:  6160376k total,       88k used,  6160288k free,   797580k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND            
27720 root      20   0  175m 3708 1408 S  0.0  0.0   0:05.79 httpd              
27722 daemon    20   0  175m 3076  708 S  0.0  0.0   0:00.00 httpd              
27723 daemon    20   0 2417m 176m  13m S  0.0  2.2   0:43.19 httpd  

我想要获取“root”用户环境下的“进程id”。

答案1

pgrep也支持按流程用户进行过滤:

pgrep -u root httpd

如果您想要从输出中提取 PID top,请尝试以下awk一行:

($NF=="httpd" && $2=="root") {print $1}

例如

top -b -n 1 -p $(pgrep -d',' http) | 
  gawk '($NF=="httpd" && $2=="root") {print $1}'

另一个有时有用的pgrep选项是-o针对最老的匹配进程,它应该是顶级httpd监听器进程(当匹配进程具有“相同”的启动时间时,pgrep 足够智能,会尝试做正确的事情)。

Apache 通常还配置为记录 pid 文件,通常在/usr/local/apache2/logs/httpd.pid 或之类的地方/var/run/httpd.pid,它也应该包含顶级 PID(尽管它的可信度稍低,因为它可能已经过时了)。

答案2

在 Linux 上,假设/proc可用(如果没有,您可能会在获取正在运行的进程的完整视图时遇到更大的问题),您可以root使用以下命令获取所有进程的 PID:

find /proc -maxdepth 1 -type d -regex '^/proc/[1-9][0-9]*$' -uid 0 -print \
| sed 's,/proc/,,g'

严格来说,这将直接列出 /proc 内所有目录,这些目录的名称以非零数字开头,后跟任意数量的数字。然后它使用sed删除/proc/每行输出开头的 ,只留下数字 PID。

可以将此输出进一步传递给您喜欢的任何进程;它将只是一个 PID 列表,每行一个。例如,您可以将输出通过管道传输到循环中,就像while read pid; do something $pid; done依次something对每个 PID 执行操作一样。

在我的系统上,输出似乎是按数字排序的,但我不认为您可以指望总是如此。sort否则会派上用场(并且根据您想要做的事情,您可能会对类似sort -rn反向数字排序的内容特别感兴趣)。

可以将该部分-uid 0替换为您想要的任何数字 UID(或查看find手册页以了解其他可能性;例如-gid)。如果您对自己的进程而不是 root 的进程感兴趣,那么类似的东西id -u会派上用场(-uid $(id -u))。

答案3

最好的工具可能是ps

   ps displays information about a selection of the active
   processes.  If you want a repetitive update of the selection
   and the displayed information, use top(1) instead.

这里的相关选项是:

   -C cmdlist
          Select by command name.  This selects the processes
          whose executable name is given in cmdlist.
   -o format
          User-defined format.  format is a single argument in
          the form of a blank-separated or comma-separated list,
          which offers a way to specify individual output
          columns.  The recognized keywords are described in the
          STANDARD FORMAT SPECIFIERS section below. 

因此,要找到所有httpd由 root 启动的进程:

$ ps -C httpd -o pid,user
  PID USER
27720 root
27722 daemon
27723 daemon

理论上。将-u root选项传递给ps应该只返回那些由运行的进程,root但这在我的系统上不起作用,不知道为什么。所以我们解析:

$ ps -C httpd -o pid,user | gawk '$2==root{print $1}'
27720

相关内容