command
Version:
v0.0.0-...-da68e98
Opens a new window with list of versions in this module.
Published: Jul 15, 2026
License: GPL-3.0
Opens a new window with license information.
Imports: 15
Opens a new window with list of imports.
Imported by: 0
Opens a new window with list of known importers.
README
¶
cmd/compiler
该目录实现编译阶段的独立入口,职责是读取 compile.json、限制编译资源、执行实际编译器,并以 JSON 输出编译是否成功。
文件说明
main.go:总入口,负责加载配置、初始化日志、执行编译流程并输出 JSON。
cfg.go:CompileConfig 定义,描述 compile.json 的字段和默认值。
compiler_linux.go:Linux 实现,负责 fork、setrlimit、输出重定向、exec 真正的编译器。
compiler_darwin.go:macOS 占位实现,仅用于跨平台开发时保持可编译。
makefile:本地 smoke 用法示例。
tests/:编译期 fixture,不同语言或极端场景的 compile.json 与样例源码。
常见检索入口
- 想改默认编译命令或参数:
cfg.go
- 想改编译资源限制:
compiler_linux.go 中的 setrLimits
- 想改编译输出文件名:
compiler_linux.go 中的 doCompile
- 想看最终返回结构:
main.go 中的 RunResult
compile.json 参数约定
-
推荐使用 Command + Args 数组,例如:
{
"command": "g++",
"args": ["main.cpp", "-o", "main", "-O2", "--static"]
}
-
Args 明确给出时,优先级高于对 Command 的拆分。
-
为兼容旧配置,args 仍接受历史上的字符串写法,内部统一按 shell 风格拆分。
-
通过环境变量或 flag 覆盖 args 时,也遵循同一套 shell 风格字符串规则。
-
如果未提供 Args,compiler 会像 runner 一样尝试对 Command 做 shlex 拆分。
-
父进程只在宿主侧读取 compile.json;bootstrap child 通过环境变量恢复配置,然后在 exec 编译器前自行应用 namespace、chroot、WorkDir、NoNewPrivs 和 UID/GID 降权。
-
父进程会为编译过程创建 task cgroup,按 Memory / MaxProcs 写入 memory.max / pids.max;bootstrap child 会先等待 cgroup gate,父进程成功 MovePID 后才放行,并用 wall-clock watchdog 在超时后杀 cgroup 和进程组。
-
NoNewPrivs 默认且强制开启;如果配置为 false,或 compiler 以 root 启动且未配置正数 RunUID / RunGID,都会 fail-closed 拒绝运行。
-
编译阶段建议由容器/调度层使用 docker run --network none 禁止网络访问;如果启动权限允许,也可以显式配置 UseNetNS=true 让 bootstrap child 自行创建 network namespace。
-
配置 ChrootDir 时,空 WorkDir 默认表示 chroot 内的 /;非空 WorkDir 必须是绝对路径。jail 内不需要包含 compiler 二进制或 compile.json,但必须包含最终编译命令所需的工具链、源码和运行时依赖。
日志输出
LogPath 默认值为空字符串,此时日志写到 stderr,适合容器和判题 worker 由外部平台统一采集。
- 如需写入文件,请在
compile.json 中显式配置 LogPath,并确保目录已存在且运行用户有写权限。
- 例如使用
/var/log/runner/compiler.log 时,部署脚本或镜像构建流程应提前创建 /var/log/runner 并设置正确的 owner/permission。
关键标识符
CompileConfig
loadConfig
setrLimits
doCompile
handle
相关目录
Documentation
¶
There is no documentation for this package.
Source Files
¶
Click to show internal directories.
Click to hide internal directories.