[NEUOJ] 测评后端分析 judgehost文件结构分析

[NEUOJ] 测评后端分析 judgehost文件结构分析

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来的 executable 分别叫testcase executable

对于每一个测评文件夹下的文件分析留到之后解释

再看看log文件夹, log文件夹内只存了必要的log信息, 没有其他东西, 至于run 和 tmp文件夹, 目前不清楚

最后看lib文件夹 ,仅介绍主要的几个文件, 我们看 lib/judge下的文件

testcase_run.sh 是用于运行程序测评的脚本, 脚本接受多个参数 会在介绍judge流程的时候具体介绍

sh-static 一个静态的 shell

judgedaemon.main.php 整个测评运行的主要程序, 实际上 bin下的judgedaemon就是来调用这个程序的

chroot-startstop.sh: 处理chroot

check_diff.sh: 简单的compare脚本

compile.sh: 一个用于调用其他compile executable的wrapper,并且保证compile不超时, 不超资源

 

以上就是judgehost的一个简单的分析, 下一篇会介绍judgedaemon的测评流程

 

 

 

 

Leave a Reply

Your email address will not be published. Required fields are marked *

5 + sixteen =

This site uses Akismet to reduce spam. Learn how your comment data is processed.