webman process进程 定时任务 卡死 不执行

aringuo

问题描述

webman中process下配置的所有任务都不执行了

程序代码

/**
 * 主任务分发定时任务
 * Class TaskDistribute
 * @package process
 */
class TaskDistribute
{
    public function onWorkerStart()
    {
        //定时任务,每个60秒判断一次
        Timer::add(10, function () {
//            echo 'timer is start', PHP_EOL;
            //主逻辑
            $this->main();
        });
        echo 'distribute timer is end', PHP_EOL;
    }

    /**
     * 任务分配主逻辑
     */
    public function main()
    {
        //获取所有状态为未分配的任务(队列任务),然后进行循环
        $where = [
            ['ExecStatus', '=', 1],//执行中
            ['DistributeStatus', '=', 0]//分发状态为0未分发
        ];
        $taskInfo = Task::where($where)
            ->with([
                'template'
            ])
            ->whereHas('template', function ($query) {
                $query->where('ExecType', '=', 1);
            })
            ->get();
        $taskModel = new Task();
        foreach ($taskInfo as $key => $item) {
            Log::channel('TaskDistribute')->debug('task distribute item info is', $item->toArray());
            $taskModel->distribute($item);
        }
    }
}

报错信息

定时任务卡死,不执行,必须reload之后才可以,所有定时任务都不执行了
workerman.log没有报错信息

截图报错信息里报错文件相关代码

以下是process配置文件
截图
以下是stdout日志
截图

以下为strace -ttp的返回结果
截图

再执行php start.php status如下
截图
截图

执行php start.php status的同时,strace -ttp有输出信息,如下
截图

执行kill -SIGALRM 404970之后,strace界面如下
截图

lsof -nPp 404970输出如下
截图
截图

1085 1 1
1个回答

walkor

怎么判断不执行了?

  • aringuo 2023-02-14

    我在任务执行逻辑里,有输出日志到log文件,然后我在tail -f 日志的时候,发现都没有更新任何信息

  • aringuo 2023-02-14

    这种情况很少见,我可能有2~3天会遇到一次,只要reload之后,就正常了,一点问题都没有了

  • walkor 2023-02-14

    onWorkerStart里定时器把输出打开,这样能判断出是定时器没执行还是业务日志没记录到。

    echo 'timer is start', PHP_EOL;

    有问题的时候执行php start.php status ,找到task_distribute进程pid,执行命令strace -ttp 进程pid 能看到进程系统调用情况,大概能判断出哪里有问题,如果不会看到时候可以发出来。

    另外你的rabbitmq_receive 进程有报错,退出了69次,看下错误日志。

  • aringuo 2023-02-14

    strace -ttp的返回结果已经贴上去了,会不会跟我的操作有关系?我之前进行的测试,需要调整linux服务器时间,我把时间调到了3天之前

  • walkor 2023-02-14

    php start.php status 截图下。

    保持strace不动,再开一个终端,执行kill -SIGALRM 404970,strace界面输出贴下。
    然后执行lsof -nPp 404970 输出贴下。

  • aringuo 2023-02-14

    好的,已经将图片贴上去了

  • walkor 2023-02-14

    调整系统时间会影响到定时器

  • aringuo 2023-02-14

    好的好的,谢谢作者大大,我也感觉是我中间调试的时候,调整linux时间导致的

年代过于久远,无法发表回答
🔝