Lancer流程
工欲善其事分瘾,必先利其器
命令
在Lancer中胎围,會用到很多Shell相關(guān)的命令。
shell中的0芹敌,1痊远,2 : 0,標(biāo)準(zhǔn)輸入,1氏捞,標(biāo)出輸出碧聪,2:標(biāo)準(zhǔn)錯誤輸出
eval : 重新運(yùn)算求出參數(shù)內(nèi)容。再次執(zhí)行
export : 在shell執(zhí)行的時候液茎,會提供一組環(huán)境變量逞姿。export可以新增、修改或者刪除環(huán)境變量捆等,供后續(xù)執(zhí)行的程序使用滞造。但是export的效力僅限于該次登陸操作。
-f 代表[變量名稱]中為函數(shù)名稱
cut : cut剪切數(shù)據(jù)使用的栋烤。以每一行為一個處理對象谒养。
cut -b 按字節(jié) -c按字符 -f按域 -d指定分隔符 與awk相似
which sh : 在Linux系統(tǒng)中,sh是bash的一個軟鏈接明郭。which sh 運(yùn)行結(jié)果 /bin/sh
$$ : echo $$ 標(biāo)示當(dāng)前shell進(jìn)程的id买窟,即pid
$* : 傳遞給腳本或者函數(shù)的所有參數(shù)。
2>>/dev/null : 把錯誤流寫進(jìn)/dev/null中薯定。unix中始绍,0代表標(biāo)準(zhǔn)輸入流(stdin),1代表標(biāo)準(zhǔn)輸出流(stdout),2代表標(biāo)準(zhǔn)錯誤流(stderr). /dev/null是類Unix系統(tǒng)中的一個特殊文件設(shè)備,作用是接受一切輸入它的數(shù)據(jù)话侄,并丟棄這些數(shù)據(jù)亏推。通常被看作垃圾桶学赛。
inet addr ifconfig后,inet addr里面的值分別是 ip地址/網(wǎng)關(guān)/子網(wǎng)掩碼
$? : 上個命令的退出狀態(tài)吞杭,或函數(shù)的返回值盏浇。
curl --silent : 靜音模式,不顯示錯誤與進(jìn)度
head -n 1 : 顯示文件的第1行
php -r : 在命令行中直接執(zhí)行php代碼
tr : Linux中tr通常對來自標(biāo)準(zhǔn)輸入的字符進(jìn)行替換篇亭、壓縮和刪除缠捌。可以將一組字符變成另外一組字符译蒂。tr 'A-Z' 'a-z' 則為大小寫替換。
tr -d 刪除第一個字符集的字符
流程
1.定義變量谊却,包括獲取數(shù)據(jù)地址柔昼,數(shù)據(jù)確認(rèn)地址,數(shù)據(jù)完成地址炎辨。UA捕透。設(shè)定時間。定義文件夾碴萧,數(shù)據(jù)文件夾乙嘀,日志文件夾。日志文件名破喻。運(yùn)行地址虎谢。
2.定義變量方法,將函數(shù)定義為變量曹质。
3.獲取機(jī)器ip婴噩,獲取1號網(wǎng)卡的ip。如果沒有羽德,就獲取0號網(wǎng)卡的ip几莽,將ip賦值給變量。
client_ip=$(ifconfig eth1 2>>/dev/null |grep 'inet addr:'|awk '{ print $2 }'|awk -F : '{ print $2 }')
if [ $client_ip"x" == "x" ]; then
client_ip=$(ifconfig eth0 2>>/dev/null |grep 'inet addr:'|awk '{ print $2 }'|awk -F : '{ print $2 }')
fi
4.如果不存在SERVER_ADDR則給他賦值當(dāng)前ip
5.如果不存在調(diào)用框架配置文件的腳本宅静,則異常推出
6.執(zhí)行配置文件章蚣,與框架相關(guān)聯(lián)
7.如果執(zhí)行配置文件出錯,即返回碼不為0姨夹,則報錯退出
8.如果配置文件中纤垂,沒有當(dāng)前機(jī)器的ip,則退出
9.如果不存在日志文件夾則創(chuàng)建日志文件夾匀伏,并記錄日志
拉取文件
10.獲取要執(zhí)行的tasks洒忧,使用curl的靜默模式(-s)請求獲取tasks接口,如果沒值够颠,停20ms熙侍,重試。如果有返回,則判斷返回參數(shù)蛉抓,是不是100000庆尘,如果不是,則重試巷送。
11.如果非正常退出驶忌,則Lancer客戶端也退出。
文件處理
12.輸出tasks的返回值笑跛。同時使用php -r在命令行中直接執(zhí)行php代碼付魔。代碼邏輯為:獲取命令行輸出,獲取到data里面的值飞蹂。然后將data里的值几苍,echo出來。知道讀不出來為止陈哑,同時將task_id queue_id command 作為變量保存下來
echo "$tasks" | $php_executor -r '$in=file_get_contents("php://stdin");$in=json_decode($in,true);foreach($in["data"] as $t){echo trim($t["task_id"])."@".trim($t["queue_id"])."@".trim($t["command"],"&; \t\n\r\0\x0B")."\n";}' | sed 's/\([\\\"]\)/\\\1/g' | while read line; do [ ! -z "$line" ] && exec_task "$line" ; done
然后后臺執(zhí)行exec腳本妻坝。
執(zhí)行
父shell中包含子shell,里面export的值惊窖,是可以在子shell中使用的刽宪。
1.建立對應(yīng)的對應(yīng)的正確|錯誤的輸出文件
2.調(diào)用確認(rèn)接口,為對應(yīng)的task進(jìn)行確認(rèn)界酒。傳入數(shù)值為queue_id,與task_id.
3.根據(jù)返回值圣拄,記錄正確或者錯誤日志。
4.再次執(zhí)行從接口取出的(設(shè)定好的)crontab指令盾计。
5.獲取執(zhí)行的退出碼售担,記錄執(zhí)行時間。
6.將標(biāo)準(zhǔn)輸出與錯誤輸出都格式化輸出署辉。這個挺屌的
lancer_stdout=$(dd if="${LANCER_LOG_STDOUT}" bs=1000 count=1 2>/dev/null | od -An -tx1 | tr ' ' % | tr -d '\n')
7.然后調(diào)用完成接口族铆,完成本次shell全部執(zhí)行,并且更新數(shù)據(jù)哭尝。