2018-06-14 bash腳本定時同步alta轉(zhuǎn)化到api系統(tǒng)的總結(jié)

  1. bash腳本里直接使用函數(shù)或者alias的好處:靈活。

當(dāng)你覺得需要修改時,直接修改函數(shù)和alias,腳本不需要重啟!(實踐證明這是無效的。原因是腳本執(zhí)行后讀取的alias可能保存了緩存,看到它重啟postback腳本時日志還是覆蓋的,不是追加。所以修改了alias,但是anyauto腳本調(diào)用的還是之前的alias定義。)
所以殺掉anyauto和postback進(jìn)程,重啟anyauto進(jìn)程即可。

比如檢測alta postback到api系統(tǒng)的腳本,檢測不存在運(yùn)行的腳本時,執(zhí)行 altatoapi 這個alias。
后面發(fā)現(xiàn)這個alias沒有持續(xù)保存日志,而是會重啟則覆蓋.于是修改alias使用 >> 重定向日志即可。

  1. 那為什么不直接寫alias或者函數(shù),而要寫一個腳本并執(zhí)行腳本呢?
    因為腳本里有while true等好多過程? 當(dāng)然,寫腳本來實現(xiàn)某一業(yè)務(wù)肯定比寫alias聽起來靠譜!
    只是腳本里如果有一些變化的東西,或者可以寫成alias的,方便shell下使用的,那么借用 #!/bin/bash --login 外加 shopt -s expand_aliases 可以讓腳本支持調(diào)用alias。

  2. 小總結(jié) :

!/bin/bash --login

shopt -s expand_aliases
上面搭配使用,可以在腳本里用alias了。
logdayold=(date -I|tr -d "-") 生成20180614這樣的日期 while : do dosomething sleep 120 done 可以啟動類似于daemon的進(jìn)程了!持續(xù)運(yùn)行的定時器。 cd{folder} 比 pushd {folder} 好,因為pushd導(dǎo)致控制臺輸出已被保存到棧的所有目錄,最后越來越多,日志顯示被打亂 linenums=(wc -l {filename}|awk '{print1}')
記住, wc -l file 顯示兩列,第一列時行數(shù),第二列是文件名。
只有 cat file|wc -l 才只顯示一列,即文件名。
調(diào)試時因為忽略這個,花了很久才發(fā)現(xiàn)這個問題
[ "logdayold" != "logday" ] && readlastdayfile
[ "logdayold" != "logday" ] && linenumsold=1
判斷是否跨天了,跨天就調(diào)用特殊函數(shù)并重置函數(shù)計數(shù)器.
sed 的行號是從1開始的,不是0。所以此處重置的話要用1。
第一次寫用了0,結(jié)果報錯調(diào)試了半天!
sed -n "{linenumsold},\ p" {filename} p命令一定需要-n選項,否則沒有輸出。 此處使用雙引號是為了使用腳本里的變量,在上引號里,需要被轉(zhuǎn)義: $。不轉(zhuǎn)義會導(dǎo)致報:",后有不識別的字符"。$ 此處表示直到文件最后一行。
使用雙引號且使用s命令的話,里面的域分隔符不要用/了,換別的吧。
使用單引號會導(dǎo)致無法使用腳本中的變量——要用的話,寫法很麻煩,所以選擇雙引號吧!
此處調(diào)試花了較多時間。
gawk '{ match(0,/getActiveLogStr":"([^\|]*?)\|/,a);print a[1]}' 在正則匹配中選擇多個分組的話,每一個角標(biāo)從1開始遞增。 gawk '{ match(0,/current_url":"([^"]?)"/,a);print a[1]}'
gawk '{ match(0,/has_finished_step":"([^"]*?)"/,a);print a[1]}' gawk '{ match(0,/msg":"([^"]
?)has_finished_step":"([^"]?)"/,a);print a[0],a[1],a[2]}'
最后一個a[0]表示所有分組內(nèi)容,a[1],a[2]則分別是第一個和第二個分組!這個是很棒的發(fā)現(xiàn)!可以一個match搞定——但是表示字符串順序相關(guān)了。
如果要順序無關(guān)的字符串提取,可以使用多個match匹配多個特征分組即可——可以用來提取alta 日志里的clickid和payout,如果需要的話。
([^|]*?)|/ 可以看到使用|來轉(zhuǎn)義|了(因為值是使用|分割的字符串),否則會報錯的哦。
egrep --color "\w+r\w+r\w+"
此處color達(dá)到了在控制臺高亮匹配部分的效果。平時shell下可用這個。
\w+ 是 egrep支持的正則形式,寫起來較好懂。
此處匹配了api系統(tǒng)的clickid的正則特征。
[ "?" ] && while read urlstr do urlstr2=(echo "urlstr") echo curl -k "{apiurl}urlstr2" \curl -s -k "{apiurl}urlstr2" echo done <{api_clickids}
最開始過濾出的clickid保存到文件了,現(xiàn)在讀取該文件,并同步到api系統(tǒng)。
echo 幫助去掉首尾空格。
curl -s 即 silent,不顯示進(jìn)度了,輸出日志就好看了。 -k是為了應(yīng)對url中有https。
最后,設(shè)置對比計數(shù)器 ,logdayold={logday} linenumsold=(({linenums}+1)) 如果不加1,那么可能會一會顯示最后一行——如果最后一行符合api系統(tǒng)clickid規(guī)則德華。加1后確保了剛好從上一次讀的最后一行的下一行開始讀。 這樣就可以不需要redis,通過sed輸出指定行數(shù)之間的內(nèi)容達(dá)到不重復(fù)發(fā)送轉(zhuǎn)化的目的了! lastday=(date -d "1 day ago" -I|tr -d "-")

  1. 源代碼:

!/bin/bash --login

shopt -s expand_aliases
apiurl="http://event.online.mobcastlead.com/e?clickid="
folder="/export/webapps/php.com/logs/debug"
api_clickids="/root/api_clickids.txt"
lastdayapi_clickids="/root/lastdayapi_clickids.txt"
logdayold=(date -I|tr -d "-") linenumsold=1 while : do cd{folder}
logday=(date -I|tr -d "-") filename="{folder}/slow_logic_postback{logday}" linenums=(wc -l {filename}|awk '{print1}')
[ "logdayold" != "logday" ] && readlastdayfile
[ "logdayold" != "logday" ] && linenumsold=1
echo "(date -Iseconds) <=> start sync to api <=>{linenumsold},{linenums}" sed -n "{linenumsold},$ p" {filename}|grep "clickid error"|grep "clickid="|gawk '{ match(0,/getActiveLogStr":"([^|]*?)|/,a);print a[1]}'|egrep --color "\w+r\w+r\w+" > {api_clickids} [ "?" ] && while read urlstr
do
urlstr2=(echo "urlstr")
echo curl -k "{apiurl}urlstr2"
\curl -s -k "{apiurl}urlstr2"
echo
done < {api_clickids} logdayold={logday}
linenumsold=(({linenums}+1))
sleep 120
done

function readlastdayfile(){
lastday=(date -d "1 day ago" -I|tr -d "-") lastdayfilename="{folder}/slow_logic_postback{lastday}" lastdaylinenums=(wc -l {lastdayfilename}|awk '{print1}')
echo "(date -Iseconds) <=> start sync to api for last day <=>{linenumsold},{lastdaylinenums}" sed -n "{linenumsold},$ p" {lastdayfilename}|grep "clickid error"|grep "clickid="|gawk '{ match(0,/getActiveLogStr":"([^|]*?)|/,a);print a[1]}'|egrep --color "\w+r\w+r\w+" > {lastdayapi_clickids} [ "?" ] && while read urlstr21
do
urlstr22=(echo "urlstr21")
echo curl -k "{apiurl}urlstr22"
\curl -s -k "{apiurl}urlstr22"
echo
done < ${lastdayapi_clickids}
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容