快速,简单,安全
下载对应平台预编译二进制文件 go-judge Release 并在终端开启
或者使用 docker
docker run -it --rm --privileged --shm-size=256m -p 5050:5050 --name=go-judge criyle/go-judge
沙箱服务提供 REST API 接口来在受限制的环境中运行程序(默认监听于 localhost:5050)。
请使用 postman 或其他 REST API 调试工具向 http://localhost:5050/run 发送请求
/sys/fs/cgroup(Systemd 默认)+----------------------------------------------------------------------------+
| 传输层 (HTTP / WebSocket / FFI / ...) |
+----------------------------------------------------------------------------+
| 工作协程 (运行环境池 和 运行环境生产者 ) |
+-----------------------------------------------------------+----------------+
| 运行环境 | 文件存储 |
+--------------------+----------------+---------------------+----------+-----+
| Linux (go-sandbox) | Windows (winc) | macOS (app sandbox) | 共享内存 | 磁盘 |
+--------------------+----------------+---------------------+----------+-----+
服务相关:
localhost:5050,使用 -http-addr 指定-enable-grpc 开启localhost:5051 ,使用 -grpc-addr 指定-silent 关闭 或 使用 -release 开启 release 级别日志(在 docker 中会自动开启)-auth-token 指定令牌鉴权localhost:5052/debug),使用 -enable-debug 开启,同时将日志层级设为 Debug-enable-metrics 开启 localhost:5052/metricslocalhost:5052,使用 -monitor-addr 指定沙箱相关:
-parallelism 指定-mount-conf 指定沙箱文件系统挂载细节,详细请参见 文件系统挂载 (仅 Linux)-file-timeout 指定文件存储文件最大时间。超出时间的文件将会删除。(例如指定 30m 时,缓存文件将在创建后 30 分钟删除)/dev/shm/),可以使用 -dir 指定另外的本地目录为文件存储256MiB,使用 -output-limit 指定 POSIX rlimit 的输出限制copyOut 文件大小为 64MiB ,使用 -copy-out-limit 指定可以在此查看更多配置文档。
从 Release 下载 go-judge-shell 。运行将连接本地 go-judge 沙箱服务并开启一个容器内的终端用于调试。
exitStatus 为 9(超时时被 SIGKILL 结束))timeLimit 时间限制clockLimit 等待时间限制pipeCollector 限制-output-limit 最大输出限制copyIn 指定文件不存在copyIn 指定文件大小超出沙箱文件系统限制copyOut 指定文件不存在SIGSEGV)seccomp 过滤器结束(默认不启用)在 Linux 平台,默认只读挂载点包括主机的 /lib, /lib64, /usr, /bin, /etc/ld.so.cache, /etc/alternatives, /etc/fpc.cfg, /dev/null, /dev/urandom, /dev/random, /dev/zero, /dev/full 和临时文件系统 /w, /tmp 以及 /proc。
使用 mount.yaml 定制容器文件系统。
不使用 mount.yaml 时,/w 的 /tmp 挂载 tmpfs 大小通过 -tmp-fs-param 指定,默认值为 size=128m,nr_inodes=4k
如果在容器的根目录存在 /.env 文件,那么这个文件会在容器创建时被载入。文件的每一行会作为环境变量的初始值加入到运行程序当中。
如果之后指定的挂载点目标在之前的挂载点之下,那么需要保证之前的挂载点存在目标文件或者文件夹。
[!WARNING]
Windows 和 macOS 平台为实验性支持,请不要在生产环境使用
在 cgroup v1 系统上 go-judge 需要 root 权限创建 cgroup。请使用 sudo 以 root 用户运行或者确保运行用户拥有以下目录的读写权限 /sys/fs/cgroup/cpuacct/gojudge, /sys/fs/cgroup/memory/gojudge, /sys/fs/cgroup/pids/gojudge。
在 cgroup v2 系统上,go-judge 会和 system dbus 沟通,创建一个临时 scope。如果 systemd 不存在,并且拥有 root 权限那么将尝试进行嵌套初始化。
如果没有 cgroup 的权限,那么 cgroup 相关的资源配置将不会生效。
go-judge 目前已经支持 cgroup v2 鉴于越来越多的 Linux 发行版默认启用 cgroup v2 而不是 v1 (比如 Ubuntu 21.10+,Fedora 31+)。然而,对于内核版本小于 5.19 的版本,因为 cgroup v2 在内存控制器里面缺少 memory.max_usage_in_bytes,内存使用量计数会转而采用 maxrss 指标。这项指标会显示的比使用 cgroup v1 时候要稍多,在运行使用内存较少的程序时比较明显。对于内核版本大于或等于 5.19 的版本,memory.peak 会被采用。
同时,如果本程序在容器中运行,容器中的进程会被移到 /api cgroup v2 层级中来开启 cgroup v2 嵌套支持。
在 systemd 为 init 的发行版中运行时,go-judge 会使用 dbus 通知 systemd 来创建一个临时 scope 作为 cgroup 的根。
在高于 5.7 的内核中运行时,go-judge 会尝试更快的 clone3(CLONE_INTO_CGROUP) 和 vfork 方法.
控制进程通常会使用 20M 内存。每个容器进程通常会占用 20M 内存 + 临时文件系统 (tmpfs) 大小 2 * 128M。对于每个请求,它将占用 用户程序限制的最大内存 + 额外限制 (16k) + 总 copy out 最大限制。请注意,缓存文件存储在宿主机的共享内存中 (/dev/shm),因此请确保分配了足够的空间。
比方说当并发数(concurrency)为 4 时,容器本身可能占用高达 60 + (20+32) * 4M = 268M + 4 * 总 copy out 限制 + 总请求的最大内存限制。
由于 Go 语言运行时(runtime)的限制,内存并不会自动返回给操作系统,这可能会导致 OOM Killer 杀死进程。因此引入了一个后台工作线程,用于检查堆内存使用情况并在必要时调用垃圾收集(GC)。
-force-gc-target 默认 20m,触发 GC 的最小堆内存使用量-force-gc-interval 默认 5s,检查内存使用情况的间隔时间$ claude mcp add go-judge \
-- python -m otcore.mcp_server <graph>