上一篇寫到回溯和例行的工作,這一片來分析回溯和例行的shell腳本
回溯:
啓動命令:nohup sh bin/回溯.sh >log.回溯 &
回溯.sh
step=0
for((i=0;i<=400;i+=1))
do
let step+=1
j=$(($i+1))
end_tm=`date +"%Y-%m-%d 00:00:00" -d "-$i""day"`
begin_tm=`date +"%Y-%m-%d 00:00:00" -d "-$j""day"`
echo $j" "$begin_tm" "$end_tm
nohup python bin/回溯_off.py $i "$begin_tm" "$end_tm" > logs/log.回溯.$i &
if [ $step -eq 10 ] ; then
step=0
wait
fi
done
說明:
step表示啓動進程數,每次啓動10個進程,然後等待現有進程結束
i表示天數,數據不會超過400天,j=i+1,也就是處理的是從i 天到i+1天的數據
let 命令是 BASH 中用於計算的工具,用於執行一個或多個表達式,變量計算中不需要加上 $ 來表示變量。如果表達式中包含了空格或其他特殊字符,則必須引起來。
用nohup運行命令可以使命令永久的執行下去,和用戶終端沒有關係,例如我們斷開SSH連接都不會影響他的運行,注意了nohup沒有後臺運行的意思;&纔是後臺運行.
-eq和=都有判斷兩邊是否相等的功能,-eq偏向整數數字,不能進行字符串的測試,=既適用於數字又適用於字符串。
回溯_off.py
# coding=utf-8
"""
特徵提取的入口
"""
from 回溯_fea import *
import sys
tab_name = "回溯_fea"
if __name__ == '__main__':
step = sys.argv[1] # 這個參數以前用,現在提取到了外邊,在shell中使用
start_tm = sys.argv[2]
end_tm = sys.argv[3]
log_file = "./logs/log.回溯_fea_off.%s" % time.strftime("%Y%m%d", time.localtime())
set_logger_log(logging.INFO, log_file)
serial_list = read_pdl_loan_serial(start_tm, end_tm)
for row in serial_list:
serial_id = row['serial_id']
user_id = row['user_id']
run_fea(serial_id, user_id, feature_config, tab_name)
例行:
例行.sh
#!/bin/bash
# 線下服務啓動
# 清除兩天前的日誌
day2ago=`date +"%Y%m%d" -d "-2day"`
rm -rf logs/log.*.$day2ago
# 同步特徵
today=`date +%Y%m%d`
function start_func()
{
nohup python bin/$1.py > logs/log.$1 2>&1 &
}
arr=("sms_keys_fea_off" "phone_contact_fea_off" "phone_location_fea_off" "phone_record_fea_off" "user_env_fea_off" \
"phone_basic_data_off" "person_info_off" "sms_keys_fea2")
for compute_job in ${arr[@]};
do
start_func $compute_job
done
$1表示讀取第一個參數
1>表示標準輸出重定向,2>表示將錯誤信息重定向,2>&1,表示將錯誤信息重定向到1的通道,也就是將所有信息寫到一起。
@表示所有參數