news 2026/6/12 23:20:53

Judge0 部署踩坑:`/box/script.py 或者 /box/Main.java` 不存在?其实是 cgroup 版本惹的祸

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Judge0 部署踩坑:`/box/script.py 或者 /box/Main.java` 不存在?其实是 cgroup 版本惹的祸

Judge0 部署踩坑:/box/script.py 或者 /box/Main.java不存在?其实是 cgroup 版本惹的祸

Judge0 1.13.1 依赖 cgroup v1,而 Ubuntu 22 默认使用 cgroup v2,导致沙箱无法创建/box目录,最终报错No such file or directory @ rb_sysopen - /box/script.py

一、问题现象

在 Docker Compose 部署 Judge0 CE 1.13.1 后,无论提交 Java 还是 Python 代码,都返回Internal Error,并提示找不到/box下的源文件。

示例请求(Python)

{"source_code":"print('hello')","language_id":71}

错误响应

{"stdout":null,"stderr":null,"message":"No such file or directory @ rb_sysopen - /box/script.py","status":{"id":13,"description":"Internal Error"}}

Java 提交同样失败

{"source_code":"public class Main { public static void main(String[] args){ System.out.println(\"hello\"); }}","language_id":62}

返回:

{"message":"No such file or directory @ rb_sysopen - /box/Main.java"}

Docker 容器日志中的关键报错

查看judge0-workers容器日志:

Failed to create control group /sys/fs/cgroup/memory/box-23/: No such file or directory chown: cannot access '/box': No such file or directory

二、错误排查的弯路

最开始容易误判为:

  • source_code参数格式错误
  • JSON 序列化问题
  • Judge0 API 调用方式不对
  • Docker volume 挂载失败
  • Main.java文件名硬编码问题

但实际完全不是代码或请求格式的问题,根本原因在操作系统层面。

三、根本原因分析

1. Judge0 的沙箱机制

Judge0 使用isolate作为代码执行沙箱。执行流程如下:

isolate 创建 box ↓ 创建 namespace ↓ 创建 /box 沙箱目录 ↓ 将源代码写入 /box/script.py 或 /box/Main.java ↓ 编译运行

2. 失败的根源:创建 box 失败

日志中明确提示:

Failed to create control group /sys/fs/cgroup/memory/box-23/

这意味着 isolate 在第一步就失败了,因此/box目录根本没被创建,后续写入文件自然报错“No such file or directory”。

3. cgroup v1 vs v2 不兼容

  • /sys/fs/cgroup/memorycgroup v1的典型路径。
  • 而现代 Linux 发行版(Ubuntu 22+、Debian 12、WSL2、Docker Desktop 默认内核)已切换到cgroup v2
  • cgroup v2 下,所有控制器统一在/sys/fs/cgroup不存在/sys/fs/cgroup/memory这个子目录。
  • Judge0 1.13.1 内置的 isolate 仍按 cgroup v1 的路径工作,导致无法创建控制组,进而整个沙箱初始化失败。

4. 确认当前系统的 cgroup 版本

mount|grepcgroup

若输出包含cgroup2 on /sys/fs/cgroup type cgroup2,说明是 v2。

再检查是否存在 v1 的 memory 目录:

ls/sys/fs/cgroup/memory

如果返回No such file or directory,则确认为 cgroup v2 环境。

四、解决方案

核心思路:将系统切换回 cgroup v1

1. 修改 GRUB 启动参数

编辑/etc/default/grub

sudonano/etc/default/grub

找到GRUB_CMDLINE_LINUX=""这一行,添加参数禁用 cgroup v2:

GRUB_CMDLINE_LINUX="systemd.unified_cgroup_hierarchy=0"

如果已有其他参数,例如:

GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0"

则追加:

GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0 systemd.unified_cgroup_hierarchy=0"
2. 更新 GRUB 配置
sudoupdate-grub
3. 重启服务器
sudoreboot
4. 验证 cgroup v1 已生效

重启后执行:

ls/sys/fs/cgroup/memory

应该能看到类似memory.limit_in_bytesmemory.stat等文件。

额外:Docker Compose 配置调整(可选但建议)

确保 workers 服务拥有足够权限:

workers:image:judge0/judge0:1.13.1privileged:true# 赋予容器特权模式cap_add:-SYS_ADMINcommand:["./scripts/workers"]volumes:-./judge0.conf:/judge0.conf:rorestart:always

重新部署 Judge0

dockercompose down-vdockercompose up-d

五、验证结果

重新提交测试代码:

{"source_code":"print('hello')","language_id":71}

返回正常执行结果:

{"stdout":"hello\n","time":"0.015","memory":3212,"stderr":null,"compile_output":null,"message":null,"status":{"id":3,"description":"Accepted"}}

Java 同样恢复正常。Judge0 + isolate 沙箱已完全工作。

六、总结

现象直接原因根本原因
/box/script.py不存在isolate 未能创建/box创建 cgroup 失败
Failed to create control groupcgroup v2 路径与 isolate 不兼容Judge0 1.13.1 依赖 cgroup v1

关键经验

  • 当你遇到 Judge0 返回Internal Error且消息为No such file or directory @ rb_sysopen - /box/xxx时,首先检查 cgroup 版本,而不是怀疑代码或 API 调用。
  • 现代 Linux 发行版默认 cgroup v2,而很多仍依赖 cgroup v1 的沙箱工具(如旧版 isolate)会因此崩溃。
  • 通过内核引导参数systemd.unified_cgroup_hierarchy=0切回 v1 是最直接有效的解决方案。

希望这篇记录能帮你少走弯路,让 Judge0 顺利跑起来!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/12 23:19:57

避坑指南:Apollo配置中心多环境(DEV/UAT/PRO)与多集群实战配置详解

Apollo多环境多集群配置实战:从原理到避坑指南当你的应用需要同时在北京和上海机房部署,每个机房又分为DEV、UAT、PRO三个环境时,配置管理就像在走钢丝——稍有不慎就会引发生产事故。去年我们团队就曾因为环境配置混淆导致线上服务读取了测试…

作者头像 李华
网站建设 2026/6/12 23:12:57

Win7系统下惠普M1005激光一体机即装即用驱动包(32/64位双版)

本文还有配套的精品资源,点击获取 简介:专为Windows 7设计的惠普LaserJet M1005多功能一体机驱动集合,内置32位和64位完整安装程序,双平台一键运行Setup.exe就能完成打印机、扫描仪、复印机三合一功能部署。驱动包含HPLJM1005.…

作者头像 李华
网站建设 2026/6/12 23:11:53

传统程序员转战大模型应用层:收藏这份进阶指南,轻松拿高薪Offer!

本文分享了作者从传统后端开发转型大模型应用层的经验,涵盖LLM基础、模型原理、RAG技术栈、流式编程等关键阶段,并推荐学习资源和开源项目,旨在帮助程序员快速入门并落地大模型应用。 先说我,传统后端开发入职阿里,工作…

作者头像 李华
网站建设 2026/6/12 23:06:51

i.MX31多媒体应用处理器:ARM1136架构、DVFS电源管理与安全启动解析

1. 项目概述:当ARM遇上多媒体,i.MX31系列如何定义移动设备的“芯”高度在2000年代中后期,智能手机和便携式多媒体设备正经历一场从“功能机”到“智能机”的深刻变革。彼时,用户不再满足于简单的通话和短信,对流畅的视…

作者头像 李华