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


1

我要求使用用户上下文过滤流程结果。我正在使用命令。

# 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”。

Answers:


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(尽管它可能稍微不那么值得信赖)。


0

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

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 part可以替换为引用你想要的任何数字UID(或者看看 find 其他可能性的手册页;例如, -gid )。如果你对自己的进程感兴趣而不是root用户,比如 id -u 会派上用场( -uid $(id -u) )。


0

对此最好的工具可能是 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

虽然情况通常如此(在这个特定实例中肯定是这种情况),但请注意awk表达式取决于所需用户名不包含空格的事实。
a CVn

@MichaelKjörling 能够 a * nix用户名是否包含空格?
terdon

好点,你抓住了那个。我不确定,但特别是在混合环境中,我真的不明白为什么不。
a CVn

我认为它不能正是因为那会导致像你建议的问题:)。无论如何,我的debian不会让我创建一个包含空格的用户名,我真的怀疑任何* nix会。
terdon

这些工具让你做的是一件事;什么你可以做黑客/ etc / passwd(这将更接近“可以吗?”)是非常不同的东西。 :)
a CVn
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.