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

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

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

#####一、下面是我第一次安装成功的过程和一些解决办法:
1、先将用户切换为root,因为需要安装一些软件和执行一些命令,这样方便。

sd@sd:/$ su root
密码:

输入密码就行了

2、将下边的命令粘贴到终端,最好先cd到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/bashapt-get updatesudo apt-get upgradeapt-get install -y mysql-server mysql-clientapt-get install -y php7.0apt-get install -y nginxapt-get install -y subversion/usr/sbin/useradd -m -u 1536 judge
cd /home/judge/svn co https://github.com/zhblue/hustoj/trunk/trunk/  srcapt-get install -y makeapt-get install -y flexapt-get install -y g++apt-get install -y clangapt-get install -y libmysqlclient-devapt-get install -y libmysql++-devapt-get install -y php-fpmapt-get install -y php-commonapt-get install -y php-xml-parserapt-get install -y php-mysqlapt-get install -y php-gdapt-get install -y php-zipapt-get install -y fp-compilerapt-get install -y openjdk-8-jdkapt-get install -y mono-develapt-get install -y php-mbstringapt-get install -y php-xmlapt-get install -y php-memcache memcachedUSER=`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 logcp src/install/java0.policy  /home/judge/etc
cp src/install/judge.conf  /home/judge/etc
chmod +x src/install/ans2outif grep "OJ_SHM_RUN=0" etc/judge.conf ; thenmkdir run0 run1 run2 run3chown www-data run0 run1 run2 run3
fised -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.confchmod 700 etc/judge.confsed -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" ;
elsesed -i "s:include /etc/nginx/mime.types;:client_max_body_size    80m;\n\tinclude /etc/nginx/mime.types;:g" /etc/nginx/nginx.conf
fimysql -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.iniCOMPENSATION=`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 restartcd src/core
chmod +x ./make.sh
./make.sh
if grep "/usr/bin/judged" /etc/rc.local ; thenecho "auto start judged added!"
elsesed -i "s/exit 0//g" /etc/rc.localecho "/usr/bin/judged" >> /etc/rc.localecho "exit 0" >> /etc/rc.local
fi
if grep "bak.sh" /var/spool/cron/crontabs/root ; thenecho "auto backup added!"
elseecho "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时的对比

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

  1. Ubuntu16.04 安装WPS(亲测)

    安装 1.下载地址:http://community.wps.cn/download/(去WPS官网下载) 2.执行安装命令:sudo dpkg -i wps-office_10.1.0.5672~a ...

  2. 阿里云ubuntu16.04 安装桌面版---亲测

    1.当我们购买了阿里云服务器后,登陆后,进行如下操作,点击云服务器. 2.点击数字,进去我们的控制台 3.我们来修改密码,设置自己想要设置的密码 充值密码:是重置ubuntu中root的密码 修改远程 ...

  3. Ubuntu18.04安装nvidia-docker(亲测有效,步骤详尽)

    Ubuntu 18.04安装NVIDIA-docker 0.前提: (1)首先安装docker:具体步骤:https://blog.csdn.net/BigData_Mining/article/de ...

  4. ubuntu 16.04 安装微信 (亲测有效)

    我的工作原因,操作系统只有ubuntu,不知是我登录的平台太多还是什么原因导致的网页版的微信被限制了, 一直用不了微信,而在ubuntu上使用微信会提供很多便利,直到遇到这个方法,亲测有效. wget ...

  5. Ubuntu18.04安装微信(亲测有效)转载,同样亲测好用

    本文的技术只能在 Ubuntu 18.04 上应用 把 Deepin-wine-for-ubuntu Git 仓库的内容克隆到本地: 这里可选择 Github 或者 Gitee,Gitee 的优点是它 ...

  6. Ubuntu 20.04 安装微信(亲测)

    参考:mirrors / wszqkzqk / deepin-wine-ubuntu · GitCode 本地安装(Ubuntu/Debian通用) 克隆 (git clone https://git ...

  7. ubuntu20.04安装微信,亲测有用

    目录 安装 主要问题 1 字体问题 2 无法发送图片 主要是通过网络搜索找到比较快速便捷的方法,以及遇到的问题,在这里归纳总结展示.引用的地方会标出出处. 安装 添加仓库 首次使用时,你需要运行如下一 ...

  8. Ubuntu18.04 安装WPS(亲测)

    转自https://blog.csdn.net/qq_14824885/article/details/81286682 卸载libreoffice sudo apt-get remove --pur ...

  9. ubuntu16.04安装gtx1070显卡驱动

    1.如果是apt-get方法进行安装的话很简单,几乎什么都不用做,几条命令就完成了 首先卸载旧版驱动,没安装过也可以运行一下,确保没有障碍 sudo apt-get autoremove --purg ...

  10. [专业亲测]Ubuntu16.04安装Nvidia显卡驱动(cuda)--解决你的所有困惑【转】

    本文转载自: 因为要做毕设需要安装caffe2,配置cuda8.0,但是安装nvidia驱动真的是把我难倒了,看了很多篇博文都没有效果,现在我自己重新总结了下几种 安装方法(亲测有效),希望能帮到大家 ...

最新文章

  1. 带哨兵节点的链_【算法导论】10.2不带哨兵节点和带哨兵节点的双向链表
  2. php 查看init,php 中init log
  3. 暴力求解法 之 枚举排列
  4. Python通过amqp消息队列协议中的Qpid实现数据通信
  5. OpenShift 4 - 为Gogs构建一个Operator
  6. 如何利用图像识别、语音识别、文本挖掘做好鉴黄?
  7. python坐标定位_python实现获取屏幕坐标位置值+VBS模拟鼠标操作
  8. 一篇通俗易懂的讲解OpenGL ES的文章
  9. arm汇编指令之数据块传输(LDM,STM)详见
  10. SONATYPE NEXUS搭建MAVEN私服
  11. ssl 1606 选课
  12. 调用谷歌翻译API(FREE)的java代码
  13. SPSS实现游程检验
  14. 天下会 - Google系列之谷歌搜索引擎高级用法:使用搜索语法精确搜索
  15. Stata | 缺失值处理标签
  16. PHPUnit 在 Windows下的安装
  17. 智利车厘子的尺寸说明,给大家扫盲
  18. ImportError: No module named urlgrabber.grabber
  19. PAKDD2020 阿里巴巴智能运维算法大赛 总结(初赛33,决赛19)
  20. 基于Selenium实现网易云音乐的登录

热门文章

  1. 0基础如何自学软件编程开发
  2. 坐标旋转变换 公式图解
  3. 小米路由器 内核 linux,小米路由器配置ssh登入方法教程
  4. /usr/bin与/usr/local/bin/区别总结
  5. Annoying Present CodeForces - 1009C
  6. .mp4视频测试地址
  7. win10网络计算机显示不全,win10系统局域网显示计算机设备不完全的解决方法
  8. 对日ODC与欧美ODC技术分析
  9. python教程cos_Python爬虫入门教程 12-100 半次元COS图爬取
  10. shell 输出7的倍数