1. 新架構使用的mongodb存放日志,技術支持需要獲取唱吧最近幾天的所有轉化日志。由于yoda功能還未開始實現(xiàn),UI沒有搜索mongdb的頁面,所以手動實現(xiàn)。
2. 具體需求如下:唱吧這個產品從18號到24號所有的轉化數(shù)據(jù)。
包括下邊三個活動
campaign_id=2560,campaign_id=2576,campaign_id=2577
3. 轉化日志是按天存放的mongdb集合,技術支持需要三個活動的日志分開存放(否則可以按天遍歷制定集合并使用or條件選擇查詢),所以需要bash里面的雙重for循環(huán):
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。使用時發(fā)現(xiàn)bash腳本怎么不能使用自定義的函數(shù)式的別名(上面的mongoexpdays)!!
5. 工作中沒有時間去研究這個了。所以手動寫了原始的mongexp語句:
#mongoexport -d mclog -c conversion_201705""$day -q "{campaign_id:$id}" -o $id""_conversion_201705""$day""_export.txt
6.真的是感覺不適用別名就無法簡單復用以前的經(jīng)驗!!回到家百度一下加上實驗,果然,shell腳本是在非交互shell執(zhí)行的,當然不會載入alias存放的位置!
果斷在腳本頭里加入如下兩行:
#!/bin/bash --login
#成為login shell,才能讀取.bashrc的Alias設置
shopt -s expand_aliases
#使用shell內置命令shopt命令來開啟alias擴展選項
7. 好了,再次測試,發(fā)現(xiàn)腳本執(zhí)行時爆出了載入alias配置文件的一些信息,比如cygpath不是有效命令 :)
然后就是看到mongoexpdays這個別名被使用了!成功導出數(shù)據(jù)!
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循環(huán)的天數(shù)寫法是列舉了所有天數(shù),應該指定范圍更方便。考慮while語句和遞增。
b. mongoexpdays這樣的別名之所以沒有寫成腳本用來調用,主要原因在于腳本一旦多了,管理起來成本高,alias的話,只需要alias|grep -i就能大致查詢到相應的命令。而且腳本的存放和多服務器腳本同步比較麻煩,所以寫在了alias配置文件里,更新維護一個文件就行。
但是這樣,alias的功能在遇到復雜問題就不夠用了,就需要寫出多個alias來,這樣不方便記憶和快速調用alias。
比如用alias寫出來一個service mongodb start/stop/status/restart這樣的功能來就比較麻煩,尤其是需要多個參數(shù)且對參數(shù)加以判斷(shell腳本使用case語句)的時候。
比如跨服務器拷貝文件,我是用scp或者rsync,然后別名都寫了很多,如果是腳本的話可以合并這些別名的,放在case語句就行了。