hustoj维护日志+crontab实现shell脚本定时更新mysql内信息并导入文件中

最近李总说要加一个oj提交统计量的功能,好家伙,一天速成了php写上去了(我是搞java的)

hustoj维护日志+crontab实现shell脚本定时更新mysql内信息并导入文件中_第1张图片

oj扩展性真是差。。文件乱七八糟,一个页面好几个php文件,搞了半天才搞到那个位置,先mark一下代码(服务器php版本老,mysqli都不能用,连接部分其他代码已经有了):

        $y=date('Y');
 		$m=date('m');
 		$d=date('d');
        $q1="select count(*) as num from solution where year(in_date) ='".$y."'";
        $q2="select count(*) as num from solution where year(in_date) ='".$y."' and month(in_date) ='".$m."'";
        $q3="select count(*) as num from solution where year(in_date) ='".$y."' and month(in_date) ='".$m."' and day(in_date) ='".$d."'";
        $re1=mysql_query($q1);
        $re2=mysql_query($q2);
        $re3=mysql_query($q3);
        if (mysql_num_rows($re1) > 0) 
        {
	    	while($row = mysql_fetch_assoc($re1))
	    	{
	        	echo "本年提交量:".$row['num']."   ";
	    	}
	    	mysql_free_result($re1);
		} else 
		{
    		echo "年提交量获得失败   ";;
		}
		if (mysql_num_rows($re2) > 0) 
        {
	    	while($row = mysql_fetch_assoc($re2))
	    	{
	        	echo "本月提交量:".$row['num']."   ";
	    	}
	    	mysql_free_result($re2);
		} 
		else 
		{
    		echo "月提交量获得失败  ";;
		}
		if (mysql_num_rows($re3) > 0) 
        {
	    	while($row = mysql_fetch_assoc($re3))
	    	{
	        	echo "当天提交量:".$row['num']."   ";
	    	}
	    	mysql_free_result($re3);
		} 
		else 
		{
    		echo "天提交量获得失败  ";;
		}

这是初始版代码。。由于echo的位置不对,后来我直接用字串保存然后嵌在了html里

结果完成了后李总又说最好以图表的形式呈现。。好吧之前完全会错意思了,难度没那么低,那就做吧,然后大致构思了下思路:

准备一个文件,里面全是从数据库里面提出来的一年内的日期信息,用crontab设置一天执行一次shell脚本来更新这个文件(为了防止数据库频繁连接耗时和造成的巨大开销),php程序直接从文件里读数据,然后用前端框架进行绘图,用折线图显示oj一年内,一周内的提交量数据变化。

然后add_up.sh脚本:

#!/bin/bash
sql="select in_date from wustacm.solution where TO_DAYS(NOW()) - TO_DAYS(in_date)<=365;";
mysql -h127.0.0.1 -P3306 -u用户 -p密码 -N -e "${sql}" >/oj_add_up/input.txt

因为一般的mysql登进去了后面的语句并不会执行,所以要写的sql语句要放在-e中,sql语句的意思是找出一年内的所有数据,最后输出到/oj_add_up中的input.txt文件中,-N表示输出结果忽视字段,-h后填主机名,记得给shell脚本可执行的权限

下面是使用crontab的过程:

ubuntu上直接sudo apt-get install cron就可以完成安装

service cron start开启服务

再输入crontab -e进入corn任务的编辑

格式是前五个参数是设定更新时间,分别对应分,小时,日期,月份,星期 然后加运行的linux命令

比如:

*/1 * * * * /home/test.sh 这样写就会每隔一分钟执行home目录下的test.sh脚本

我的写法:

0 4 * * * /home/add_up.sh 这样就表示在每天的4点进行一次add_up.sh脚本(人比较少)

保存一下,就会显示已经new了一个cron任务,否则会提示新建失败

和一般的service一样cron也可以用stop,status,restart等命令进行控制,还是很好用的

这样就实现了脚本的定时更新mysql数据到文件,这也算一种速度的优化吧

------------------------------------------------------------------------------------------------------------------------------------------

2018.10.31更,经过测试,统计量功能终于上线了,感谢mqy的协助

hustoj维护日志+crontab实现shell脚本定时更新mysql内信息并导入文件中_第2张图片

你可能感兴趣的:(日志,Linux学习,服务器,linux,crontab,定时任务,服务器)