使用shell解析脚本依赖关系,并自动补数
将脚本依赖关系放到表中
使用shell解析脚本依赖关系,递归的计算各个脚本。
#!/bin/bash
# 2017.08. dm 补数 basepath=$(cd `dirname $`; pwd)
cd $basepath source /etc/profile
source ../etc/env.ini if [[ $# -ne ]]; then
echo "参数格式错误!"
echo "$0 [运算日期,格式:'yyyy-mm-dd'] [运算类型:down/up] [表名列表] "
echo "注:运算类型:down:表名是dm结果表,首先查找并调用其依赖的脚本,然后调用结果表。up:根据传入的前置表,查找其影响的结果表,然后执行。"
echo "注:表名列表 (如果传入一个以上的表,需要用\" \"分割,\"\"包裹):单表,例如“dm_event_meterial”;多表,例如“\dm_event_meterial,dm_voice_meterial\"”"
exit
fi #运算类型 run_type down up
run_type=$
#脚本名
shellNames=$
#运算日期
sdate=$(date -d "-1 day" "+%Y-%m-%d")
if [[ $# -eq ]]; then
sdate=$(date -d "$1" "+%Y-%m-%d")
fi #映射关系缓存
dmDic=""
#刷新映射关系缓存
function dic(){
local dm=$
dmDic=$(spark-sql -e "
use $HIVE_DB_ODS_S;
select concat_ws(\",\",tmp.dm,tmp.shell) from
(
select dm,shell
from yq_control_execute
where dm=\"$dm\"
union
select c2.dm as dm,c2.shell as shell
from yq_control_execute c1
inner join
yq_control_execute c2
on c1.shell = c2.dm
where c1.dm=\"$dm\"
union
select c3.dm as dm,c3.shell as shell
from yq_control_execute c1
inner join
yq_control_execute c2
on c1.shell = c2.dm
inner join
yq_control_execute c3
on c2.shell = c3.dm
where c1.dm=\"$dm\"
) tmp where tmp.shell!=tmp.dm
;
")
} #将参数的shell列表转化为dm列表
function getDms(){
local first=
shellNameSqlPart=""
for _shellName in $shellNames
do
if [[ "$first" -ne "" ]]; then
shellNameSqlPart=$shellNameSqlPart",\"$_shellName\""
else
shellNameSqlPart=\"$_shellName\"
((first++))
fi
done
echo $(spark-sql -S -e "
use $HIVE_DB_ODS_S;
select dm from
(
select dm
from yq_control_execute
where shell in ($shellNameSqlPart)
union
select c1.dm
from yq_control_execute c1
inner join
yq_control_execute c2
on c1.shell = c2.dm
where c2.shell in ($shellNameSqlPart)
union
select c1.dm
from yq_control_execute c1
inner join
yq_control_execute c2
on c1.shell = c2.dm
inner join
yq_control_execute c3
on c2.shell = c3.dm
where c3.shell in ($shellNameSqlPart)
) tmp
;
")
} #根据dm返回其依赖的shell列表
function getShellS() {
if [[ $# -ne ]]; then
echo "$0 parameter length error."
exit
fi
local target=$
local shells=""
for line in $dmDic
do
local __dm=$(echo $line|cut -d ',' -f )
local __shell=$(echo $line|cut -d ',' -f )
if [[ "$target" == "$__dm" ]]; then
local shells=$shells" "$__shell
fi
done
echo $shells
} runnedArray="" runCount= #检查并执行脚本
#只执行dm开头并且没有执行过的脚本,执行过后存入已执行列表
function checkAndRun(){
local flag=
local c_shell=$
for record in $runnedArray
do
if [[ "$record" == "$c_shell" ]]; then
local flag=
fi
done
# echo "已执行的脚本"$runnedArray
if [[ "$flag" == "" && "${c_shell:0:2}" == "dm" ]]; then
runnedArray="$runnedArray ${c_shell}"
((runCount++))
echo "【$runCount】sh ./deal/${c_shell}.sh"
sh ./deal/${c_shell}.sh $sdate
sh ./export/main.sh $sdate ${c_shell}
fi
} #递归执行dm
function run(){
local _dm=$
for shell in $(getShellS $_dm)
do
# echo $shell"==>"$_dm
if [[ "${shell:0:2}" == "dm" ]]; then
run $shell
checkAndRun $shell
fi
done
if [[ "${_dm:0:2}" == "dm" ]]; then
checkAndRun $_dm
fi
} if [[ "$run_type" == "up" ]]; then
#找出其对应的结果表 遍历执行
for dm in $(getDms $shellNames)
do
#执行前 更新依赖关系
dic $dm
run $dm
done
else
#遍历执行传入的dm列表
for dm in $shellNames
do
#执行前 更新依赖关系
dic $dm
run $dm
done
fi
脚本依赖表的格式:

这个依赖表除了有脚本的源表和目标表的关系,还有数据的来源类型(平台和渠道);如果要实现基本功能的话,如下几列即可。
| 列 | 类型 | 注释 |
| from | string | 源表 |
| to | string | 目标表 |
使用shell解析脚本依赖关系,并自动补数的更多相关文章
- Prism 4 文档 ---第3章 管理组件间的依赖关系
基于Prism类库的应用程序可能是由多个松耦合的类型和服务组成的复杂应用程序,他们需要根据用户的动作发出内容和接收通知进行互动,由于他们是松耦合的,他们需要一种方式来互动和交流来传递业务功能的需求. ...
- Makefile 7——自动生成依赖关系 三颗星
后面会介绍gcc获得源文件依赖的方法,gcc这个功能就是为make而存在的.我们采用gcc的-MM选项结合sed命令.使用sed进行替换的目的是为了在目标名前加上“objs/”前缀.gcc的-E选项, ...
- makefile自动生成依赖关系
手工编写依赖关系不仅工作量大而且极易出现遗漏,更新也很难及时,修改源或头文件后makefile可能忘记修改.为了解决这个问题,可以用gcc的-M选项自动生成目标文件和源文件的依赖关系.-M选项会把包含 ...
- Shell 命令行,写一个自动整理 ~/Downloads/ 文件夹下文件的脚本
Shell 命令行,写一个自动整理 ~/Downloads/ 文件夹下文件的脚本 在 mac 或者 linux 系统中,我们的浏览器或者其他下载软件下载的文件全部都下载再 ~/Downloads/ 文 ...
- pip自动生成requirements.txt依赖关系清单
Python项目中经常会带requirements.txt文件,里面是项目所依赖的包的列表,也就是依赖关系清单,这个清单也可以使用pip命令自动生成. pip命令: 1 pip freeze > ...
- 自动配置pom文件,构建maven项目jar包依赖关系,找到jar包运用到jmeter
首先说下pom文件特别方便的优点: 什么是pom文件? POM(Project Object Model) 是Maven的基础. 它是一个XML文件,包含了Maven用来build项目所需要的项目配置 ...
- Shell脚本交互之:自动输入密码
Shell脚本交互之:自动输入密码 2016年04月09日 19:41:26 zhangjikuan 阅读数:58208 标签: Shell交互自动输入密码expect重定向管道 更多 个人分类: A ...
- IDEA maven项目查自动查看依赖关系,解决包冲突问题
在maven项目中找到pom.xml,打开. <dependencies> <dependency> <groupId>org.apache.storm</g ...
- Ambari服务依赖关系图生成脚本
1. 生成服务依赖关系 #!/usr/bin/python import sys import commands import json def genDependString(ip): url=&q ...
随机推荐
- C#引用C++的DLL方案(C#调用非托管动态链接库)
SocketClientInit是C++里面定义的方法,通过EntryPoint = "?SocketClientInit@@YAHHHPAD@Z"指出这个函数的真正入口处,方法是 ...
- Spark读HBase写MySQL
1 Spark读HBase Spark读HBase黑名单数据,过滤出当日新增userid,并与mysql黑名单表内userid去重后,写入mysql. def main(args: Array[Str ...
- wireshark 无线抓包
1)抓取无线网卡的数据包(类似有线,仅抓取本网卡的数据包,适用与windows,linux) 1. 打开菜单项“Capture”下的子菜单“Capture Options”选项: 2. 找到设置面 ...
- 20164322 韩玉婷-----Exp5 MSF基础应
Exp5 MSF基础应用 1.基础问题回答 exploit: 是指攻击者或渗透测试者利用一个系统.应用或服务中的安全漏洞所进行的攻击行为, 包括利用缓冲区溢出.Web应用程序漏洞攻击,以及利用配置错误 ...
- socks5代理转http代理
Convert-Shadowsocks-into-an-HTTP-proxy apt-get install polipo service polipo stop polipo socksParent ...
- 学习笔记TF056:TensorFlow MNIST,数据集、分类、可视化
MNIST(Mixed National Institute of Standards and Technology)http://yann.lecun.com/exdb/mnist/ ,入门级计算机 ...
- 我的linux部署nginx步骤记录
http://www.runoob.com/linux/nginx-install-setup.html 安装prce找不到GCC c++文件 解决方法: yum install gcc-c++^C ...
- 【缓存】介绍和使用场景 MEMCACHE REDIS
缓存缓存就是在内存中存储的数据备份,当数据没有发生本质改变的时候,我们就不让数据的查询去数据库进行操作,而去内存中取数据,这样就大大降低了数据库的读写次数,而且从内存中读数据的速度比去数据库查询要快一 ...
- Tenka 1 Computer Contest C-Align
C - Align Time limit : 2sec / Memory limit : 1024MB Score : 400 points Problem Statement You are giv ...
- kotlin 编译 运行 hello world
kotlin 编译器下载地址:https://github.com/JetBrains/kotlin/releases/tag/v1.3.31 解压:kotlin-compiler-1.3.31.zi ...