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输出如下
怎么判断不执行了?
我在任务执行逻辑里,有输出日志到log文件,然后我在tail -f 日志的时候,发现都没有更新任何信息
这种情况很少见,我可能有2~3天会遇到一次,只要reload之后,就正常了,一点问题都没有了
onWorkerStart里定时器把输出打开,这样能判断出是定时器没执行还是业务日志没记录到。
有问题的时候执行
php start.php status
,找到task_distribute进程pid,执行命令strace -ttp 进程pid
能看到进程系统调用情况,大概能判断出哪里有问题,如果不会看到时候可以发出来。另外你的rabbitmq_receive 进程有报错,退出了69次,看下错误日志。
strace -ttp的返回结果已经贴上去了,会不会跟我的操作有关系?我之前进行的测试,需要调整linux服务器时间,我把时间调到了3天之前
php start.php status
截图下。保持strace不动,再开一个终端,执行
kill -SIGALRM 404970
,strace界面输出贴下。然后执行
lsof -nPp 404970
输出贴下。好的,已经将图片贴上去了
调整系统时间会影响到定时器
好的好的,谢谢作者大大,我也感觉是我中间调试的时候,调整linux时间导致的