NEUOJ的测评后端暂时使用的是domjudge 的 judgehost作为测评后端 下面分析一下judgehost的工作原理 首先分析一下judgehost的几个核心文件的功能 [这里省略了从clone domjudge repo 到编译安装好judgehost这个过程, 我认为来看这篇文章的应该都是已经可以自己安装好domjudge的人,不然可能这篇文章对于你来说还不适合阅读] 首先看bin下面的文件 runguard 是负责保证用户程序的安全运行, 不会对系统进行破坏的程序, 这个的代码利用了 rlmit, cgroup timeout等方式对用户程序进行限制 judgedaemon 一个php脚本, 测评后端的完整进程, 包括通过服务器下载数据, 到调用相应可执行文件对代码进行编译运行比对之后. 将结果返回给webserver的整个过程都是由这个程序进行的 runpipe: 用于在runjury(特殊的测评程序) 和 user program之间建立双向管道,进行交互式测评(目前只了解这些) create_cgroups: 在设置了enable_cgroup 的编译参数之后, 通过这个来创建domjudge的 control group, cgroup能够获得更精确的运行时间和使用资源情况 dj_make_chroot, dj_make_ubuntu_chroot: 用于让java程序可以在chroot环境下运行 再看etc文件夹下的文件 sudoers.domjudge: 这个文件配置好了 运行测评的时候的用户的sudo权限配置 common-config.php: 一些通常的config文件 judgehost-static.php: 通过make 和 make install生成的静态config文件,不要进行修改 restapi.secret: 里面存有向API请求的时候的API地址和认证信息 再看judgings文件夹 judgings文件夹下, 所有的文件都是测评的时候生成的, 他的第一级给每一个judgehost分配一个不同的文件夹,名字为 HOSTNAME-n , 每一个judgehost都要以一个不同的用户来运行, 不然会产生问题 每个judgings文件夹下, 有多个endpoint, 每一个endpoint对应你再 restapi.secret里面配置的不同的名字 如endpoint-neuoj 每个endpoint下 , 有 这样的文件夹: c[n]-s[n]-j[n] 每一个文件夹内都是一次测评,如果这个测评之前被测过了, 重新测评的时候, 原来的测评会叫做 c[n]-s[n]-j[n]-old-timestamp , 除了每一个测评一个文件夹以外, 还有两个文件夹, 一个用于存从服务器fetch来的input output, 一个用于存从服务器fetch来的…
Read More Read More