我想知道一种检查 HTTPD 进程以查找正在运行的 PHP 脚本的方法。
我已经做了“netstat”,发现有些进程占用 DB 和网络套接字的时间太长,现在我想知道是什么脚本导致了这种情况。
顺便说一句,我正在使用 Linux。
答案1
您需要有 Apache 模块mod_status
已启用(CentOs 的主 Apache 配置文件位于 /etc/httpd/conf/httpd.conf)
LoadModule status_module modules/mod_status.so
带选项ExtendedStatus on
(这将在与上述相同的配置文件中设置)
# ExtendedStatus controls whether Apache will generate "full" status
# information (ExtendedStatus On) or just basic information (ExtendedStatus
# Off) when the "server-status" handler is called. The default is Off.
#
ExtendedStatus On
并为此设置了一些访问权限(将以下内容替换XXX.XXX.XXX.XXX
为您的 IP - 可以在与上述相同的配置文件中找到)
# Allow server status reports generated by mod_status,
# with the URL of http://servername/server-status
# Change the ".example.com" to match your domain to enable.
#
<Location /server-status>
SetHandler server-status
Order deny,allow
Deny from all
Allow from localhost 127.0.0.1 XXX.XXX.XXX.XXX
</Location>
最后,你将通过访问查看每个 HTTPD 进程正在做什么http://你的服务器名称/服务器状态
这将以所呈现的方式显示当前正在处理的 pid 和 URL这里。
答案2
建议使用 mod_status 是一个很好的替代方案,可以查看当前进程正在执行什么操作,您可以启用它(通常添加允许语句以允许您从访问 Web 服务器的 IP 范围查看它),然后浏览http://site.name/server-status
并获得不错的输出。Apache 自己的网站上有一个示例:http://www.apache.org/server-status
另一个有用的工具是查看进程发生了什么lsof
,如果您有一个已知的 PID“挂起”,您可以键入lsof -p <pid>
以查看该进程发生了什么。要匹配所有进程,您可以键入类似lsof -c apache
或 的内容lsof -c httpd
。它是一种非常通用的工具,有很多选项可供选择。
最后,您strace
可以将其附加到正在运行的进程,以查看它们当前正在执行的系统调用等操作strace -p <pid>
。警告,这有时会挂起正在运行的进程,因此请密切注意并在必要时重新启动。
lsof(8) 手册页:http://linux.die.net/man/8/lsof
strace(1)手册页:http://linux.die.net/man/1/strace