今天备忘下用了10年的shell旧脚本,主要是放到crontab去执行业务脚本的。比如:
1、需要每分钟需要执行发邮件脚本、预警脚本,
2、每5分钟需要执行一次当天各个维度注册付费的统计工作,得到二次统计报表
3、每小时需要拉取一次广告渠道的成本数据到本地来
4、每天要执行统计一些留存数据等
执行过程中,就需要一些参数处理,比如fix数据,需要重跑昨天的数据,或者需要批量重跑下某几个脚本这些,当然这边的业务php脚本是已经处理好,可以通过传递日期参数执行对应时间的数据的,实际可用根据业务来修整,整体完整代码参考如下:
#!/bin/bash
#5分钟统计一次
#*/5 * * * * /bin/sh /opt/www/datasite/dcs/sh/crontab_report_data_now.sh --logdir=/opt/www/datasite/dcs/log --phpdir=/opt/www/datasite/dcs/local --startdate=20200309 --enddate=20200309
export LANG="en_US.UTF-8"
INIT_DIR=`dirname $0`
cd ${INIT_DIR}/
usage () {
cat <<EOF
Usage: $0 [OPTIONS]
--phpdir=PATH Crontab call php path
--logdir=PATH Crontab run result log save path
--startdate=date php param1 start date(20120911)
--enddate=date php param2 end date(20120912)
--help Print this message
EOF
exit 1
}
parse_arguments() {
for arg do
case "$arg" in
--phpdir=*) phpdir=`echo "$arg" | sed -e "s;--phpdir=;;"` ;;
--logdir=*) logdir=`echo "$arg" | sed -e "s;--logdir=;;"` ;;
--startdate=*) startdate=`echo "$arg" | sed -e "s;--startdate=;;"` ;;
--enddate=*) enddate=`echo "$arg" | sed -e "s;--enddate=;;"` ;;
--help) usage ;;
*) echo "Invalid argument $arg" ;;
esac
done
}
parse_arguments "$@"
if [ -z $phpdir ] ; then
echo "phpdir required "
exit 1
fi
if [ -z $logdir ] ; then
echo "logdir required "
exit 1
fi
strMonth=`date "+%Y%m"`
logFile="${logdir}/crontab_load_data_${strMonth}.log"
cd ${phpdir}
name=(
load_data.php
r_gap_kefu_pay_day.php
r_gap_basic_day.php
r_gap_bf_basic_day.php
r_ga_basic_day.php
r_g_basic_day.php
#r_p_basic_day_wanba.php
r_gc_basic_day_danji.php
r_g_qz_pay_day.php
r_gapp_xd_pay_day.php
wx_ad_report_set_pt.php
)
if [ -z $startdate ] ; then
for i in ${name[*]}
do
/usr/bin/php $i >> ${logFile}
done
else
#两个参数存在
if [ -z $enddate ] ; then
#昨天日期参数
if [ $startdate = "yesterday" ]
then
startdate=$(date -d "yesterday" +%Y-%m-%d)
fi
#循环并过滤特殊
for i in ${name[*]}
do
if [ $i = "load_data.php" ]
then
continue
fi
/usr/bin/php $i $startdate >> ${logFile}
done
else
for i in ${name[*]}
do
if [ $i = "load_data.php" ]
then
continue
fi
/usr/bin/php $i $startdate $enddate >> ${logFile}
done
fi
fi
【代码说明】
1、crontab使用方式如下:
#每8分钟执行一次
*/8 * * * * /bin/sh /opt/www/datasite/dcs/sh/crontab_report_data_now.sh --logdir=/opt/www/datasite/dcs/log --phpdir=/opt/www/datasite/dcs/local >/dev/null 2>&1 &
#每天凌晨1点钟跑一遍昨天的统计
0 1 * * * /bin/sh /opt/www/datasite/dcs/sh/crontab_report_data_now.sh --logdir=/opt/www/datasite/dcs/log --phpdir=/opt/www/datasite/dcs/local --startdate=yesterday >/dev/null 2>&1 &
当然也可以手动带参数执行,比如:
#【一个日期参数,表示重跑某一天的数据】
/bin/sh /opt/www/datasite/dcs/sh/crontab_report_data_now.sh --logdir=/opt/www/datasite/dcs/log --phpdir=/opt/www/datasite/dcs/local --startdate=20220331
#【两个日期参数,表示重跑某一段时间的数据】
/bin/sh /opt/www/datasite/dcs/sh/crontab_report_data_now.sh --logdir=/opt/www/datasite/dcs/log --phpdir=/opt/www/datasite/dcs/local --startdate=20220301 --enddate=20220331
2、前面38行代码,基本就是实现下图功能了,提示参数说明用途和检测必要参数
3、40-54行就是定义日志路径(例子上是每月一个日志文件记录),接收脚本的echo信息,然后定义需要执行的脚本名称。
4、55-87就是业务参数判断的了,得到对应日期参数,然后赋值给php脚本带进去执行。php里面可以通过argv来接收参数。这里有个提醒,如果php业务脚本不互相依赖,也可以在执行地方后面加上&符号,让后台同时执行多脚本。
for i in ${name[*]}
do
/usr/bin/php $i >> ${logFile} &
done