一次php进程诡异退出的排查过程

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:
背景

最近给XX项目搭建一个反垃圾平台。效果不错,但是出现了一个诡异的事情。离线扫描部分会有一个常驻的php进程,以便处理发现的垃圾信息。常驻的php进程总是诡异的退出。php代码示例如下:


<?php
while(1){
    $content = fgets(STDIN);
    if(empty($content)){
        sleep(1);
    }
    //逻辑处理部分代码省略
}
?>
AI 代码解读

排查过程

最初的想法是php执行过程中出现的致命错误,导致php进程退出。好吧,我们使用register_shutdown_function来跟踪下到底是什么错误导致的进程退出。(想更多了解register_shutdown_function,请查看博文 妙用php中的register_shutdown_function和fastcgi_finish_request)加入了错误捕捉代码。如下:


<?php
$is_end = false;
function catch_error(){
        global $is_end;
        $time = date('Y-m-d H:i:s');
        $error = error_get_last();
        $msg = "$time [error]";
        if($is_end){
                $msg .= "is_end[yes]";
        }else{
                $msg .= "is_end[no]";
        }
        if($error){
                $msg .= var_export($error,1);
        }
        echo $msg."\r\n";
}
register_shutdown_function("catch_error");
?>
AI 代码解读

可是,php进程再次退出。而在日志中并没有记录任何信息。说明register_shutdown_function方法根本没有执行。是什么导致register_shutdown_function方法没有运行呢?在php的官方文档中又这样一个注释:


Shutdown functions will not be executed if the process is killed with a SIGTERM or SIGKILL signal. While you cannot intercept a SIGKILL, you can use pcntl_signal() to install a handler for a SIGTERM which uses exit() to end cleanly.
AI 代码解读

注释的意思是当php进程获得SIGTERM和SIGKILL信号而退出时,是不执行register_shutdown_function方法的。可以使用pcntl_signal()方法来捕获信息,并调用相应的处理方法。

好,那是不是信号导致我们的php进程退出呢?我们加入如下代码:


<?php
declare(ticks = 1);
function sig_handler($signo){
        $time = date('Y-m-d H:i:s');
        echo $time." exit  signo[{$signo}]\r\n";
        exit("");
}
pcntl_signal(SIGTERM, "sig_handler");
pcntl_signal(SIGHUP, "sig_handler");
pcntl_signal(SIGINT, "sig_handler");
pcntl_signal(SIGQUIT, "sig_handler");
pcntl_signal(SIGILL, "sig_handler");
pcntl_signal(SIGPIPE, "sig_handler");
pcntl_signal(SIGALRM, "sig_handler");
?>
AI 代码解读

过一段时间,发现php进程退出了,日志中出现了如下日志信息:
2014-11-23 18:30:06 exit signo[14]
2014-11-23 18:30:06 [error]is_end[no]

 

看来是sigalarm信号导致php进程退出了。这个信号是可以捕获和处理的。这样无关紧要的信号,我们还是忽略吧。最终的代码如下:


<?php
declare(ticks = 1);
$is_end = false;
function catch_error(){
        global $is_end;
        $time = date('Y-m-d H:i:s');
        $error = error_get_last();
        $msg = "$time [error]";
        if($is_end){
                $msg .= "is_end[yes]";
        }else{
                $msg .= "is_end[no]";
        }
        if($error){
                $msg .= var_export($error,1);
        }
        echo $msg."\r\n";
}
register_shutdown_function("catch_error");
 
function sig_handler($signo){
        $time = date('Y-m-d H:i:s');
        if($signo == 14){
                //忽略alarm信号
                echo $time." ignore alarm signo[{$signo}]\r\n";
        }else{
                echo $time." exit  signo[{$signo}]\r\n";
                exit("");
        }
}
pcntl_signal(SIGTERM, "sig_handler");
pcntl_signal(SIGHUP, "sig_handler");
pcntl_signal(SIGINT, "sig_handler");
pcntl_signal(SIGQUIT, "sig_handler");
pcntl_signal(SIGILL, "sig_handler");
pcntl_signal(SIGPIPE, "sig_handler");
pcntl_signal(SIGALRM, "sig_handler");
while(1){
    $content = fgets(STDIN);
    if(empty($content)){
        sleep(1);
    }
    //逻辑处理部分代码省略
}
$is_end = true;
?>
AI 代码解读

经过一段观察,在日志中又发现了alarm相关的日志,但是php进程依然在。看来我们的修改有作用了。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
打赏
0
0
0
0
440
分享
相关文章
os-copilot安装与多项功能测评,帮助开发人员PHP环境排查问题
本文介绍了OS Copilot在ECS上 Alibaba Cloud Linux的安装与使用,并对其多项参数进行了功能测评。OS Copilot是为操作系统提供智能化辅助的工具,支持自动化任务、智能推荐、故障排查等功能。安装时需检查是否已安装(`rpm -q os-copilot`),若未安装则用`yum install os-copilot`命令安装,并配置AccessKey信息连接阿里云服务。通过测试不同参数命令,如`-t`参数,展示了其自动化执行和智能生成回答的能力,显著提升运维效率。
os-copilot安装与多项功能测评,帮助开发人员PHP环境排查问题
如何排查和解决PHP连接数据库MYSQL失败写锁的问题
通过本文的介绍,您可以系统地了解如何排查和解决PHP连接MySQL数据库失败及写锁问题。通过检查配置、确保服务启动、调整防火墙设置和用户权限,以及识别和解决长时间运行的事务和死锁问题,可以有效地保障应用的稳定运行。
167 25
如何在宿主主机运行容器中的php守护进程
在Docker容器中同时运行多个程序(如Nginx+PHP+Ftp)时,需用`docker exec`命令启动额外服务。首先通过`php -v`查看PHP版本,再用`which php-fpm7.4`确认PHP安装路径,通常返回`/usr/sbin/php-fpm7.4`。最后直接运行该路径启动PHP-FPM服务,确保其正常工作。
58 14
|
5月前
|
PHP
PHP的pcntl多进程用法实例
PHP使用PCNTL系列的函数也能做到多进程处理一个事务。
54 12
|
11月前
|
Linux进程与信号:正常与异常的退出机制探索
Linux进程与信号:正常与异常的退出机制探索
670 1
|
11月前
|
Linux 进程问题调查探秘:分析和排查频繁创建进程问题
Linux 进程问题调查探秘:分析和排查频繁创建进程问题
192 0
【Linux】—— 进程的创建和退出
【Linux】—— 进程的创建和退出
|
11月前
|
Linux【问题记录 02】腾讯云 cron、sshd 进程CPU占用超95%(亡命徒 Outlaw 僵尸网络攻击)问题排查及处理步骤
Linux【问题记录 02】腾讯云 cron、sshd 进程CPU占用超95%(亡命徒 Outlaw 僵尸网络攻击)问题排查及处理步骤
233 0
kswapd0进程对于CPU占有率高的情况下排查到黑客植入脚本,与黑客斗智斗勇的三个回合(一)
kswapd0进程对于CPU占有率高的情况下排查到黑客植入脚本,与黑客斗智斗勇的三个回合
738 1
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等