crontab通过shell脚本执行业务脚本

今天备忘下用了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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值