我有一个需求,需要使用用户上下文来过滤处理结果。我正在使用类似的命令。
# 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