自动更新网站访问量的定时脚本

原理:Nginx 会把访问日志写入 access.log

当然 这不是 本文的重点

这种东西 Google 一下,一大堆

本文要实现的功能

  1. 获取总 page view,注意去重,同一 ip 只记录一次
  2. 获取时间段中的 page view
  3. 脚本化(时间变量化,写入文件自动化)
  4. 定时任务

总 PV

awk '{print $1}' /usr/local/nginx/logs/access.log|sort | uniq -c |wc -l >> pv
# sort  - 按ip进行排序
# uniq  - 去重
# wc -l - 统计行数
# awk   - 输出结果
1
2
3
4
5

时间段 Pv

根据上述脚本,我们知道如何获取去重后的总 Pv

要获得时间段内的 Pv,只需要对 access.log 中的数据进行一次筛选

awk '{split($4,array,"[");if(array[2]>="25/Sep/2018:00:00:00" && array[2]<="25/Sep/2018:23:59:59"){print $1}}' /usr/local/nginx/logs/access.log|sort | uniq -c | wc -l
1

可以看到在原有的代码基础上增加了 sed 处理

剔除 Status 不为 200 的数据

awk '{if($9==200)print $0}' /var/log/nginx/access.log
1

脚本化

先来看下我们想实现怎么样的效果

把 RADEME.md 文件的最后一行替换为新的

<center>历史访问量:2645 | 昨日访问量: 280</center>
1

我们把 这一行文字 分成 五部分

历史访问量:`$(total Pv)` | 昨日访问量: `$(yesterday Pv)`
主要是两个数据,需要利用两个脚本分别算出来

为了让数据落盘 只能通过 >> 存到文件中,持久化

剩下的字符串也通过脚本写入文件中

最后再用一条 echo $(cat xxx) 把文件中的字符串压成一行

得到

loglocal=/usr/local/nginx/logs/access.log
echo "<center>累计访问量:" > log/pv
awk '{if($9==200)print $1}' $loglocal|sort | uniq -c |wc -l >> log/pv
echo "| 昨日访问量:" >> log/pv
awk '{if($9==200){split($4,array,"[");if(array[2]>="08\/Sep\/2018:00:00:00" && array[2]<="08\/Sep\/2018:23:59:59"){print $1}}}' $loglocal|sort | uniq -c | wc -l >> log/pv
echo "</center>" >> log/pv
sed -i '$d' docs/README.md
echo $(cat log/pv) >> docs/README.md
1
2
3
4
5
6
7
8

这样的脚本能用,但需要每天改时间

于是,同理把时间改为变量,再在最后调用部署脚本

loglocal=/usr/local/nginx/logs/access.log
echo "<center>累计访问量:" > log/pv
awk '{if($9==200)print $1}' $loglocal|sort | uniq -c |wc -l >> log/pv
echo "| 昨日访问量:" >> log/pv
yMonth=`date -d yesterday +%B`
today="$(date -d yesterday +%d)/${yMonth:0:3}/$(date -d yesterday +%Y)"
am="$today:00:00:00"
pm="$today:23:59:59"
awk '{if($9==200){split($4,array,"[");if(array[2]>=am && array[2]<=pm){print $1}}}' am="$am" pm="$pm" $loglocal|sort | uniq -c | wc -l >> log/pv
echo "</center>" >> log/pv
sed -i '$d' docs/README.md
echo $(cat log/pv) >> docs/README.md
1
2
3
4
5
6
7
8
9
10
11
12

定时任务

Linux 下 crontab 作为定时任务托管平台

通过crontab -e定制

但是定时任务的环境与直接运行脚本不太一样

定时任务相当于在/目录下运行 command

lz 因为这个问题查了好久,最后发现 build.sh 里因为一句话权限不够导致不能执行

最后加了一个sudo就解决了 坑爹

如果出现定时任务不生效的情况,可以使用打日志的方式

*/10 * * * * cd /usr/local/www/wyydsb/blog && bash pv.sh >> log/crontab.log 2>&1
# 2>&1 打日志
# 五个* 分别代表 分 时 天 月 年
# * 代表任意
# */10 时间除以10变化时更新一次 即每个10执行一次
1
2
3
4
5
You can use this BibTex to reference this blog if you find it useful and want to quote it.