- 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使用 >> 重定向日志即可。
那為什么不直接寫alias或者函數(shù),而要寫一個腳本并執(zhí)行腳本呢?
因為腳本里有while true等好多過程? 當(dāng)然,寫腳本來實現(xiàn)某一業(yè)務(wù)肯定比寫alias聽起來靠譜!
只是腳本里如果有一些變化的東西,或者可以寫成alias的,方便shell下使用的,那么借用 #!/bin/bash --login 外加 shopt -s expand_aliases 可以讓腳本支持調(diào)用alias。小總結(jié) :
!/bin/bash --login
shopt -s expand_aliases
上面搭配使用,可以在腳本里用alias了。
logdayold={folder} 比 pushd
(wc -l
1}')
記住, wc -l file 顯示兩列,第一列時行數(shù),第二列是文件名。
只有 cat file|wc -l 才只顯示一列,即文件名。
調(diào)試時因為忽略這個,花了很久才發(fā)現(xiàn)這個問題
[ "logday" ] && readlastdayfile
[ "logday" ] && linenumsold=1
判斷是否跨天了,跨天就調(diào)用特殊函數(shù)并重置函數(shù)計數(shù)器.
sed 的行號是從1開始的,不是0。所以此處重置的話要用1。
第一次寫用了0,結(jié)果報錯調(diào)試了半天!
sed -n " p"
需要被轉(zhuǎn)義: $。不轉(zhuǎn)義會導(dǎo)致報:",后有不識別的字符"。$ 此處表示直到文件最后一行。
使用雙引號且使用s命令的話,里面的域分隔符不要用/了,換別的吧。
使用單引號會導(dǎo)致無法使用腳本中的變量——要用的話,寫法很麻煩,所以選擇雙引號吧!
此處調(diào)試花了較多時間。
gawk '{ match(0,/current_url":"([^"]?)"/,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的正則特征。
[ "(echo "
{apiurl}
{apiurl}
{api_clickids}
最開始過濾出的clickid保存到文件了,現(xiàn)在讀取該文件,并同步到api系統(tǒng)。
echo 幫助去掉首尾空格。
curl -s 即 silent,不顯示進(jìn)度了,輸出日志就好看了。 -k是為了應(yīng)對url中有https。
最后,設(shè)置對比計數(shù)器 ,logdayold=((
(date -d "1 day ago" -I|tr -d "-")
- 源代碼:
!/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={folder}
logday={folder}/slow_logic_postback
(wc -l
1}')
[ "logday" ] && readlastdayfile
[ "logday" ] && linenumsold=1
echo "{linenumsold},
{linenumsold},$ p"
0,/getActiveLogStr":"([^|]*?)|/,a);print a[1]}'|egrep --color "\w+r\w+r\w+" >
?" ] && while read urlstr
do
urlstr2=urlstr")
echo curl -k "urlstr2"
\curl -s -k "urlstr2"
echo
done < {logday}
linenumsold={linenums}+1))
sleep 120
done
function readlastdayfile(){
lastday={folder}/slow_logic_postback
(wc -l
1}')
echo "{linenumsold},
{linenumsold},$ p"
0,/getActiveLogStr":"([^|]*?)|/,a);print a[1]}'|egrep --color "\w+r\w+r\w+" >
?" ] && while read urlstr21
do
urlstr22=urlstr21")
echo curl -k "urlstr22"
\curl -s -k "urlstr22"
echo
done < ${lastdayapi_clickids}
}