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

发布时间:2026/6/12 23:21:14

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/memory是cgroup 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 v11. 修改 GRUB 启动参数编辑/etc/default/grubsudonano/etc/default/grub找到GRUB_CMDLINE_LINUX这一行添加参数禁用 cgroup v2GRUB_CMDLINE_LINUXsystemd.unified_cgroup_hierarchy0如果已有其他参数例如GRUB_CMDLINE_LINUXnet.ifnames0 biosdevname0则追加GRUB_CMDLINE_LINUXnet.ifnames0 biosdevname0 systemd.unified_cgroup_hierarchy02. 更新 GRUB 配置sudoupdate-grub3. 重启服务器sudoreboot4. 验证 cgroup v1 已生效重启后执行ls/sys/fs/cgroup/memory应该能看到类似memory.limit_in_bytes、memory.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重新部署 Judge0dockercompose 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_hierarchy0切回 v1 是最直接有效的解决方案。希望这篇记录能帮你少走弯路让 Judge0 顺利跑起来

相关新闻