首先最近想自动化实现mongodb的管理,因为现在维护mongodb每天要记录总的记录数和每天新增的记录数,无非就是两条查询语句: db.videos.count() 和 db.vid_add.count(),不过每天都要进入mongodb的shell里,执行这两条语句,接着记录日期,复制数据到一个文本文件里,每天都这样重复的操作。所以想写个脚本,在Linux下通过crontab自动维护。
这里用的是mongodb 1.6.4,64位,linux版
网上的mongodb的中文资料少得可怜,只能自己试。首先查询mongo命令的参数,发现有个--shell的参数,在mongodb的官网里有说明,mongodb可以通过这个参数运行js脚本,再通过官网的一个例子:https://github.com/mdirolf/shell_presentation/blob/master/slides.js,发现也不是很难。接着就在linux服务器上写了个简单的脚本,
mongo.js
print("all count:" + db.videos.count() ); print("add count:" + db.vid_add.count() );
接着在linux 试了一下:
/mongo localhost/myCollections --shell /home/bosshida/mongo.js
发现真的可以了:输出
MongoDB shell version: 1.6.4
connecting to: localhost/crawler
type "help" for help
all count:113358593
add count:2940633
不过这时是进入了mongodb 的 shell 控制台,这样就需要再写个脚本来关闭此进程
根据经验就知道是通过ps 列出全部进程,再通过grep找出进程ID, 接着kill掉
因为要去掉grep本身这个进程,又上网查了下资料,可以通过grep -v 'grep'来排除含有grep的进程,最后通过管道怎样kill掉找出的进程,脚本如下:
ps -ef| grep '/home/mongodb/bin/mongo local/myCollection --shell mongo.js' | grep -v 'grep'| awk '{print $2}' | xargs kill
其中awk是提取出进程号,xargs kill 是网上找来的,在man kill也没找到说明,我猜应该是对传过来的参数做为pid,接着kill掉。
其中对awk不熟悉,通过一些资料,大概用法也了解,主要是掌握 awk '/pattern/{action}' 这个规则,就是通过pattern找出符合的(正则),再执行action。
Kill掉进程后,还没完事,还要抽取数据写入文件,
其中要抽取的数据只是
all count:113358593
add count:2940633
这两行,所以我另外写一个脚本来抽取数据并写入到另外的文件
echo `date`>> result.txt | sed -n '4,5p' stat.txt | awk -F : '{print $2}' >> result.txt
说明一下:
脚本的流程是先把日期写入result.txt文件,再通过sed把stat.txt文件的第4,5行抽取出来,通过awk抽取每行的数据追加到result.txt文件。
sed -n '4,5p' stat.txt 的意思是从文件的第4行开始到第5行,截取其内容。
awk -F : '{print $2}'的意思是以冒号":"为分隔符,打印第二个数值。
这样工作就大概完成了,最后写个crontab,每天定时运行脚本,就自动记录Mongodb的数据了。