You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Moodle作业模块后台处理任务因缺失记录失败求助

解决Moodle 4.1.4中mod_assign定时任务持续失败的问题

问题根源

从错误日志可明确:mod_assign\task\cron_task任务尝试访问ID为341的作业记录,但该记录已从数据库删除,而关联的课程模块数据未被清理,导致任务每次执行都会触发查询失败。

解决方案

1. 清理数据库残留关联数据(推荐)

从数据库层面清除无效关联记录,从根源解决问题:

  • 先确认assign表中无ID=341的记录:
    SELECT * FROM mdl_assign WHERE id = 341;
    
  • 查询course_modules表是否存在关联该作业的残留记录:
    SELECT cm.* FROM mdl_course_modules cm
    JOIN mdl_modules md ON md.id = cm.module
    WHERE cm.instance = 341 AND md.name = 'assign';
    
  • 若存在上述记录,执行删除操作:
    DELETE cm FROM mdl_course_modules cm
    JOIN mdl_modules md ON md.id = cm.module
    WHERE cm.instance = 341 AND md.name = 'assign';
    

2. 修改代码增加容错(临时方案)

若暂时无法操作数据库,可修改assign模块的cron逻辑,让任务自动跳过不存在的作业(注意:Moodle升级后该修改会被覆盖,需重新调整):

  • 打开文件/mod/assign/locallib.php,找到assign::cron()方法中调用get_coursemodule_from_instance的代码行
  • 将原代码中的MUST_EXIST参数改为IGNORE_MISSING,并增加判断逻辑:
    // 原代码
    // $cm = get_coursemodule_from_instance('assign', $assign->id, 0, false, MUST_EXIST);
    
    // 修改后
    $cm = get_coursemodule_from_instance('assign', $assign->id, 0, false, IGNORE_MISSING);
    if (!$cm) {
        debugging("Skipping non-existent assignment ID {$assign->id}", DEBUG_INFO);
        continue;
    }
    

3. 清除Moodle缓存

完成上述操作后,登录Moodle后台,进入站点管理 → 开发 → 清除缓存,全选所有缓存类型并执行清除,确保任务队列的缓存更新。

内容的提问来源于stack exchange,提问作者Pob808

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 20:05:03