必威体育Betway必威体育官网
当前位置:首页 > IT技术

ubuntu16.04 安装hustoj 最新【亲测,附带常见问题解决】

时间:2019-06-30 10:42:17来源:IT技术作者:seo实验室小编阅读:72次「手机版」
 

hustoj

最近在学习linux,就想着搭建一个oj玩玩。在网上找了好多教程,发现因为版本比较老,好多文件已经变了。装了好几次,中间出现各种问题,但是也借着这次机会对linux命令有了进一步的理解和认识。

因为网上下载的脚本安装时会出现各种情况,且最后还不能保证一定能搭建成功,文章后边有一个脚本,是经过修改的,可直接执行脚本搭建oj。

本文介绍了我在搭建中遇到的一些常见问题及解决办法,最后总结了一个脚本,直接运行即可安装成功,中间会有四个文件无法创建或无法连接,属于正常情况,不用理会,直接登录网站即可。在安装前期会提示设置数据库密码,请全部设置为root。

#####一、下面是我第一次安装成功的过程和一些解决办法:

1、先将用户切换为root,因为需要安装一些软件和执行一些命令,这样方便。

sd@sd:/$ su root

密码:

输入密码就行了

2、将下边的命令粘贴到终端,最好先C++d到home目录,下载之后的install-ubuntu16+.sh脚本就在home目录

wget HTTPs://raw.githubusercontent.com/zhblue/hustoj/master/trunk/install/install-ubuntu16+.sh

3、在运行install-ubuntu16+.sh脚本的时候cd到home目录,因为脚本里的一些重要软件可能安装不上,所以先提前安一下。

apt-get update

apt-get install mysql-server mysql-client

//在执行完这句后,会弹出一个窗口让设定mysql的密码,要设定为root

apt-get install nginx

//这个容易出错,我之前直接运行脚本,这个安装会有错误。在安装完之后再运行一下下边的命令看一下有没有错误,有的话直接解决,不然后边很麻烦。

nginx -t

apt-get install php7.0

下面是运行nginx -t之后的结果,说明没问题。如果报错可能是有一个文件里多注释了一行,会有提示是哪个文件,对照一下{}(花括号)就知道哪行是多注释的了。

root@sd:/# nginx -t

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok

nginx: configuration file /etc/nginx/nginx.conf test is successful

将以上三个安装好之后其实就可以避免绝大多数问题了,剩下的问题可能也就是少了个文件啊啥的。

4、接下来就是运行脚本了,但是不建议直接运行脚本进行安装,因为中间可能会出现问题,然后再去改的花会很麻烦的,所以,强烈建议自己手动复制命令去运行,一旦出现问题直接去解决,这样会容易很多。我就是自己手动执行的,虽然你会感觉很麻烦,还慢,但是最后你会发现自己手动执行比执行脚本不止快了一点,因为执行脚本一旦出现问题,不会直接停下来,等停下来可能已经出好多错误了。

5、在执行 chown www-data src/web/upload data run0 run1 run2 run3 这条命令时,可能会报错没有run0 run1 run2 run3文件夹,那么基本上就是之前的命令没有执行对

if grep “OJ_SHM_RUN=0” etc/judge.conf ; then

mkdir run0 run1 run2 run3

chown www-data run0 run1 run2 run3

fi

解决办法:

在执行这句命令之前,就去 etc/judge.conf 中看看 OJ_SHM_RUN=0这句是否等于0,如果不是,将值改为0,然后在运行上边的命令即可。

6、还有就是在执行 ./make.sh 这句的时候会报错,是因为make.sh脚本中

rm /usr/bin/sim_rb /usr/bin/sim_sh

//这句会报错 因文件不存在无法删除

ln -s /usr/bin/sim_c /usr/bin/sim_cc

//这句会报错 因为文件已存在无法连接

这两个错误可以不用理会,因为那两个文件本来就需要删除的,第二句链接既然已经存在了,也就不用再去连了。

7、后边基本上就可以安装成功了。

8、打开oj,打开浏览器,输入127.0.0.1进入oj的页面,如果标签那块已经显示oj的图标了(像下图那样),但是页面上一片空白,也没有报错

这里写图片描述

是因为数据库没有给密码,无法连接到数据库的原因。先打开/home/judge/src/web/include/db_info.inc.php

这里写图片描述

找到图片中最后一行的 static $DB_PASS=“root”,我这里双引号中的root是数据库的密码(就是最开始安装数据库时弹窗里填写的密码),你的这里双引号中应该是什么都没有的,将密码填进去就OK了。

9、到这里基本就是我安装这个oj的大致过程了。因为遇到的情况有限,如果出现其他问题,请根据install-ubuntu16+.sh脚本 中的命令自行更正。

#####二、用修改过后的脚本安装,一键搞定

上面的安装方法虽然也能安装上,但还是会出现各种问题,不一定一次就装上了。

后来发现其中的安装脚本在安装重要软件的时候总是会出错,或者配置出错导致不能正常判题,我就出现过永久等待,刚解决完又是永久编译,然后就是一直编译错误。

永久等待可能是judged没有启动服务,可以用 ps -A命令来查看,如果找不到judged那就输入judged,来启动服务。如果启动后还是永久等待的话,就需要查看/home/judge/etc/judge.conf 和 /home/judge/src/web/include/db_info.inc.php 这两个目录下的配置是否正确,特别是/home/judge/etc/judge.conf里边的 OJ _RUNNING=4 。

下面是我修改过后的脚本:

#!/bin/bash

apt-get update

sudo apt-get upgrade

apt-get install -y mysql-server mysql-client

apt-get install -y php7.0

apt-get install -y nginx

apt-get install -y subversion


/usr/sbin/useradd -m -u 1536 judge
cd /home/judge/

svn co https://github.com/zhblue/hustoj/trunk/trunk/  src

apt-get install -y make

apt-get install -y flex

apt-get install -y g++

apt-get install -y clang

apt-get install -y libmysqlclient-dev

apt-get install -y libmysql++-dev

apt-get install -y php-fpm

apt-get install -y php-common

apt-get install -y php-xml-parser

apt-get install -y php-mysql

apt-get install -y php-gd

apt-get install -y php-zip

apt-get install -y fp-compiler

apt-get install -y openjdk-8-jdk

apt-get install -y mono-devel

apt-get install -y php-mbstring

apt-get install -y php-xml

apt-get install -y php-memcache memcached


USER=`cat /etc/mysql/debian.cnf |grep user|head -1|awk  '{print $3}'`
PASSword=`cat /etc/mysql/debian.cnf |grep password|head -1|awk  '{print $3}'`
cpu=`grep "cpu cores" /proc/cpuinfo |head -1|awk '{print $4}'`

mkdir etc data log

cp src/install/java0.policy  /home/judge/etc
cp src/install/judge.conf  /home/judge/etc
chmod +x src/install/ans2out

if grep "OJ_SHM_RUN=0" etc/judge.conf ; then
	mkdir run0 run1 run2 run3
	chown www-data run0 run1 run2 run3
fi

sed -i "s/OJ_USER_NAME=root/OJ_USER_NAME=$USER/g" etc/judge.conf
sed -i "s/OJ_PASSWORD=root/OJ_PASSWORD=$PASSWORD/g" etc/judge.conf
sed -i "s/OJ_COMPILE_CHROOT=1/OJ_COMPILE_CHROOT=0/g" etc/judge.conf
sed -i "s/OJ_RUNNING=1/OJ_RUNNING=$CPU/g" etc/judge.conf

chmod 700 etc/judge.conf

sed -i "s/DB_USER=\"root\"/DB_USER=\"$USER\"/g" src/web/include/db_info.inc.php
sed -i "s/DB_PASS=\"root\"/DB_PASS=\"$PASSWORD\"/g" src/web/include/db_info.inc.php
chmod 700 src/web/include/db_info.inc.php
chown www-data src/web/include/db_info.inc.php
chown www-data src/web/upload data run0 run1 run2 run3
if grep client_max_body_size /etc/nginx/nginx.conf ; then 
	echo "client_max_body_size already added" ;
else
	sed -i "s:include /etc/nginx/mime.types;:client_max_body_size    80m;\n\tinclude /etc/nginx/mime.types;:g" /etc/nginx/nginx.conf
fi

mysql -h localhost -u$USER -p$PASSWORD < src/install/db.sql
echo "insert into jol.privilege values('admin','adMinistrator','N');"|mysql -h localhost -u$USER -p$PASSWORD 

sed -i "s:root /var/www/HTML;:root /home/judge/src/web;:g" /etc/nginx/sites-enabled/default
sed -i "s:index index.html:index index.php:g" /etc/nginx/sites-enabled/default
sed -i "s:#location ~ \\\.php\\$:location ~ \\\.php\\$:g" /etc/nginx/sites-enabled/default
sed -i "s:#\tinclude snippets:\tinclude snippets:g" /etc/nginx/sites-enabled/default
sed -i "s|#\tfastcgi_pass unix|\tfastcgi_pass unix|g" /etc/nginx/sites-enabled/default
sed -i "s:}#added_by_hustoj::g" /etc/nginx/sites-enabled/default
sed -i "s|# deny access to .htaccess files|}#added by hustoj\n\n\n\t# deny access to .htaccess files|g" /etc/nginx/sites-enabled/default
/etc/init.d/nginx restart
sed -i "s/post_max_size = 8M/post_max_size = 80M/g" /etc/php/7.0/fpm/php.ini
sed -i "s/upload_max_filesize = 2M/upload_max_filesize = 80M/g" /etc/php/7.0/fpm/php.ini

COMPENSATION=`grep 'mips' /proc/cpuinfo|head -1|awk -F: '{printf("%.2f",$2/5000)}'`
sed -i "s/OJ_CPU_COMPENSATION=1.0/OJ_CPU_COMPENSATION=$COMPENSATION/g" etc/judge.conf

/etc/init.d/php7.0-fpm restart
service php7.0-fpm restart

cd src/core
chmod +x ./make.sh
./make.sh
if grep "/usr/bin/judged" /etc/rc.local ; then
	echo "auto start judged added!"
else
	sed -i "s/exit 0//g" /etc/rc.local
	echo "/usr/bin/judged" >> /etc/rc.local
	echo "exit 0" >> /etc/rc.local
fi
if grep "bak.sh" /var/spool/cron/crontabs/root ; then
	echo "auto backup added!"
else
	echo "1 0 * * * /home/judge/src/install/bak.sh" >> /var/spool/cron/crontabs/root
fi
ln -s /usr/bin/mcs /usr/bin/gmcs

/usr/bin/judged
cp /home/judge/src/install/hustoj /etc/init.d/hustoj
update-rc.d hustoj defaults

附录:安装后几个重要配置文件的位置

/home/judge/etc/judge.conf

/home/judge/src/web/include/db_info.inc.php

/etc/php/7.0/fpm/php.ini

/etc/nginx/sites-enabled/default

如遇其他情况可以针对这几个文件进行修改,也有可能是某个软件没有安装导致的OJ不能正常运行。

目录:/home/judge/etc/judge.conf

OJ_HOST_NAME=127.0.0.1     #mysql host ip
OJ_USER_NAME=root          #mysql host username
OJ_PASSWORD=root           #mysql host password
OJ_DB_NAME=jol             #mysql DB name
OJ_PORT_NUMBER=3306        #mysql port
OJ_RUNNING=4               #max concurrent threads number of judge_client
OJ_SLEEP_TIME=5            #judged work Interval
OJ_TOTAL=1                 #Deprecated: total number of judged (hosts/processes)
OJ_MOD=0                   #Deprecated: the number of this judged(host)
OJ_JAVA_TIME_BONUS=2       #java's extral time
OJ_JAVA_MEMORY_BONUS=512   #java's extral memory
OJ_SIM_ENABLE=0            #using sim
OJ_HTTP_JUDGE=0            #using http link to database(if enabled,mysql is not used anymore)
OJ_HTTP_BASEURL=http://127.0.0.1/JudgeOnline   #http link basedir
OJ_HTTP_USERNAME=admin      #account in db that has http_judge privilege
OJ_HTTP_PASSWORD=admin      #password of this account
OJ_OI_MODE=0               #using oi (Olympiad in Informatics) mode
OJ_SHM_RUN=0               #using /dev/shm for fast running & low harddisk wear
OJ_USE_MAX_TIME=0          #use the max time of all testcase rather than total time
OJ_LANG_SET=0,1,2,3,4     #selective judge solution of languages
OJ_HOST_NAME=127.0.0.1     如果用mysql连接读取数据库,数据库的主机地址
OJ_USER_NAME=root             数据库帐号
OJ_PASSWORD=root              数据库密码
OJ_DB_NAME=jol                    数据库名称
OJ_PORT_NUMBER=3306       数据库端口
OJ_RUNNING=4                      judged会启动judge_client判题,这里规定最多同时运行几个judge_client
OJ_SLEEP_TIME=5                 judged通过轮询数据库发现新任务,轮询间隔的休息时间,单位秒
OJ_TOTAL=1                           老式并发处理中总的judged数量
OJ_MOD=0                              老式并发处理中,本judged负责处理solution_id按照TOTAL取模后余数为几的任务。
OJ_JAVA_TIME_BONUS=2      Java等虚拟机语言获得的额外运行时间。
OJ_JAVA_MEMORY_BONUS=512    Java等虚拟机语言获得的额外内存。
OJ_SIM_ENABLE=0                 是否使用sim进行代码相似度的检测
OJ_HTTP_JUDGE=0                 是否使用HTTP方式连接数据库,如果启用,则前面的HOST_NAME等设置忽略。
OJ_HTTP_BASEURL=http://127.0.0.1/JudgeOnline  使用HTTP方式连接数据库的基础地址,就是OJ的首页地址。
OJ_HTTP_USERNAME=admin          使用HTTP方式所用的用户帐号(HTTP_JUDGE权限),该帐号登录时不能启用VCODE图形验证码,但可以登录成功后启用。
OJ_HTTP_PASSWORD=admin          密码
OJ_OI_MODE=0                                是否启用OI模式,即无论是否出错都继续判剩余的数据,在ACM比赛中一旦出错就停止运行。
OJ_SHM_RUN=0                              是否使用/dev/shm的共享内存虚拟磁盘来运行答案,如果启用能提高判题速度,但需要较多内存。
OJ_USE_MAX_TIME=1                     是否使用所有测试数据中最大的运行时间作为最后运行时间,如果不启用则以所有测试数据的总时间作为超时判断依据。
OJ_LANG_SET=0,1,2,3,4     #判哪些语言的题目

目录:/home/judge/src/web/include/db_info.inc.php


static  $DB_HOST="localhost";  数据库的服务器地址
static  $DB_NAME="jol";        数据库名
static  $DB_USER="root";       数据库用户名
static  $DB_PASS="root";       数据库密码
        // connect db 
static  $OJ_NAME="HUSTOJ";      OJ的名字,将取代页面标题等位置HUSTOJ字样。
static  $OJ_HOME="./";          OJ的首页地址
static  $OJ_ADMIN="root@localhost"; 管理员email
static  $OJ_DATA="/home/judge/data"; 测试数据所在目录,实际位置。
static  $OJ_BBS="discuss";//"bbs" 论坛的形式,discuss为自带的简单论坛,bbs为外挂论坛,参考bbs.php代码。
static  $OJ_ONLINE=false; 是否使用在线监控,需要消耗一定的内存和计算,因此如果并发大建议关闭
static  $OJ_LANG="en";  默认的语言,中文为cn
static  $OJ_SIM=true;   是否显示相似度检测的结果。
static  $OJ_DICT=true;  是否启用在线英字典
static  $OJ_LANGMASK=1008; //1mC 2mCPP 4mpascal 8mJava 16mRuby 32mBash 1008 for security reason to mask all other language 用掩码表示的OJ接受的提交语言,可以被比赛设定覆盖。
static  $OJ_EDITE_AREA=true;// 是否启用高亮语法显示的提交界面,可以在线编程,无须IDE。
static  $OJ_AUTO_SHARE=false;//true: 自动分享代码,启用的话,做出一道题就可以在该题的Status中看其他人的答案。
static  $OJ_css="hoj.css"; 默认的css,可以选择dark.css和gcode.css,具有有限的界面制定效果。
static  $OJ_SAE=false; //是否是在新浪的云平台运行web部分
static  $OJ_VCODE=true; 是否启用图形登录、注册验证码。
static  $OJ_APPENDCODE=false; 是否启用自动添加代码,启用的话,提交时会参考$OJ_DATA对应目录里是否有append.c一类的文件,有的话会把其中代码附加到对应语言的答案之后,巧妙使用可以指定main函数而要求学生编写main部分调用的函数。
static  $OJ_MEMCACHE=false;是否使用memcache作为页面缓存,如果不启用则用/cache目录
static  $OJ_MEMSERVER="127.0.0.1"; memcached的服务器地址
static  $OJ_MEMPORT=11211;  memcached的端口
static  $OJ_RANK_LOCK_PERCENT=0;  //比赛封榜时间的比率,如5小时比赛设为0.2则最后1小时封榜。
static  $OJ_SHOW_DIFF=false;  //显示WrongAnswer时的对比

相关阅读

分享到:

栏目导航

推荐阅读

热门阅读