大量PHP进程致CPU占用过高,如何排查问题关联脚本?
定位CPanel下lsphp进程对应的问题脚本方法
因为你的GoDaddy CPanel没有终端权限,只能通过PHP代码或CPanel自带工具排查,以下是具体可行的方法:
1. 用PHP执行更详细的进程查询命令
原来的ps aux | grep php只能看到基础进程信息,改用带完整参数的命令,能获取进程启动时的脚本路径:
exec('ps auxfww | grep lsphp', $output); print_r($output);
fww参数会显示完整的命令行参数(包括脚本路径)和进程树结构,能看到父进程与子进程的关联,方便对应到具体的cron任务。- 输出里的CMD列会显示lsphp启动的具体PHP脚本路径,比如
lsphp /home/youruser/public_html/subdomain/cron.php,直接定位问题脚本。
2. 查看单个进程的详细资源与文件关联
针对可疑的PID(比如你提供的809796),用lsof命令查看进程打开的文件、网络连接等信息:
$target_pid = 809796; // 替换成你要排查的进程PID exec("lsof -p $target_pid", $output); print_r($output);
- 输出里会包含进程正在读写的文件路径(比如运行的PHP脚本、日志文件),还有网络连接的目标地址(对应爬取任务的站点),能快速锁定是哪个子域名的爬取脚本。
3. 利用CPanel自带的监控与日志工具
- Cron任务日志:在CPanel的「Cron Jobs」模块中,部分主机商会提供执行日志;也可以通过文件管理器尝试访问
/var/log/cron(若有权限),日志里会记录每个cron任务的执行时间、用户和脚本路径,结合进程的STIME字段(比如你提供的07:44),匹配对应的任务。 - 资源监控模块:打开CPanel的「Resource Usage」或「Metrics」页面,里面会展示实时进程列表,部分主机的CPanel会直接标注进程对应的脚本路径和所属子域名,无需自行执行命令。
4. 给cron脚本添加启动日志
临时修改所有子域名的cron脚本,添加PID和启动记录:
// 放在脚本最开头,日志路径请改为你有权限写入的位置 $log_path = '/home/youruser/cron_debug.log'; $log_content = date('Y-m-d H:i:s') . " | 脚本路径: " . __FILE__ . " | PID: " . getmypid() . "\n"; file_put_contents($log_path, $log_content, FILE_APPEND);
当进程堆积时,通过异常PID就能在日志里找到对应的脚本文件,同时也能排查脚本是否未正常退出导致进程残留。
内容的提问来源于stack exchange,提问作者Cody_T
相关产品推荐
相关产品推荐

