1. 新架构使用的mongodb存放日志,技术支持需要获取唱吧最近几天的所有转化日志。由于yoda功能还未开始实现,UI没有搜索mongdb的页面,所以手动实现。
2. 具体需求如下:唱吧这个产品从18号到24号所有的转化数据。
包括下边三个活动
campaign_id=2560,campaign_id=2576,campaign_id=2577
3. 转化日志是按天存放的mongdb集合,技术支持需要三个活动的日志分开存放(否则可以按天遍历制定集合并使用or条件选择查询),所以需要bash里面的双重for循环:
for id in 2560 2576 2577
do
for day in 18 19 20 21 22 23 24
do
echo mongoexpdays $id conversion 201705""$day >> 2017-05-25_Changba_allConversion.txt
4. 上面的代码存放在mongo服务器的/home/mongodb目录下/home/mongolog/20170525/changba。使用时发现bash脚本怎么不能使用自定义的函数式的别名(上面的mongoexpdays)!!
5. 工作中没有时间去研究这个了。所以手动写了原始的mongexp语句:
#mongoexport -d mclog -c conversion_201705""$day -q "{campaign_id:$id}" -o $id""_conversion_201705""$day""_export.txt
6.真的是感觉不适用别名就无法简单复用以前的经验!!回到家百度一下加上实验,果然,shell脚本是在非交互shell执行的,当然不会载入alias存放的位置!
果断在脚本头里加入如下两行:
#!/bin/bash --login
#成为login shell,才能读取.bashrc的Alias设置
shopt -s expand_aliases
#使用shell内置命令shopt命令来开启alias扩展选项
7. 好了,再次测试,发现脚本执行时爆出了载入alias配置文件的一些信息,比如cygpath不是有效命令 :)
然后就是看到mongoexpdays这个别名被使用了!成功导出数据!
8. mongoexpdays定义如下:
alias mongoexpdays='func_export(){ mkdir -m 777 -p /home/mongolog/$(now);cd /home/mongolog/$(now);mongoexport -d mclog -c $2_$3 -q "{campaign_id:$1}" -o $1_$2_$3_export.txt;};func_export $@'
9.提出几个改进的空间:
a. for循环的天数写法是列举了所有天数,应该指定范围更方便。考虑while语句和递增。
b. mongoexpdays这样的别名之所以没有写成脚本用来调用,主要原因在于脚本一旦多了,管理起来成本高,alias的话,只需要alias|grep -i就能大致查询到相应的命令。而且脚本的存放和多服务器脚本同步比较麻烦,所以写在了alias配置文件里,更新维护一个文件就行。
但是这样,alias的功能在遇到复杂问题就不够用了,就需要写出多个alias来,这样不方便记忆和快速调用alias。
比如用alias写出来一个service mongodb start/stop/status/restart这样的功能来就比较麻烦,尤其是需要多个参数且对参数加以判断(shell脚本使用case语句)的时候。
比如跨服务器拷贝文件,我是用scp或者rsync,然后别名都写了很多,如果是脚本的话可以合并这些别名的,放在case语句就行了。