shell解决资源抢占的问题以及调度无法对任务进行判定是否执行——让任务job在所想时间段执行

shell解决资源抢占的问题以及调度无法对任务进行判定是否执行

1.先来说说场景

我们有一个任务是分钟级别spark任务,他启动时无法知道前一次是否成功,然后就会不停的创建任务最后导致资源占用;而且我们现在一套集群,上面有分钟级、小时级别、天级、随机任务一起跑,无法做到分离。

 

 

2.来看一下基础的shell开发

(1)shell的if

demo 接收一个参数
sh testif.sh 1
#! /bin/bash
set -e 
base=.
type=$1
if [ ! $type ]
then 
    echo "type is null"
elif [ $type -eq 0 ]
then
    echo "type is 0"
elif [ $type -eq 1 ] 
then
    echo "type is 1"
else
    echo "type is other"
fi

注意点:
1、每一个if 或者elif后面需要一个then
2、if 的条件判断[]中的表达式必须和[或者]留有一个字符的宽度

(2)shell脚本中比较时间的代码

#!/bin/bash

date1="180609"
date2="180610"

day=$(date "+%Y-%m-%d" -d "$date1 0 day")
echo $day

t1=`date -d "$date1" +%s`
t2=`date -d "$date2" +%s`

echo t1=$t1
echo t2=$t2

if [ $t1 -gt $t2 ]; then
    echo "$date1 > $date2"
elif [ $t1 -eq $t2 ]; then
    echo "$date1 == $date2"
else
    echo "$date1 < $date2"
fi

 

3.来看我写的业务代码

给入参数时间段做的事情。请注意,这里我就学习了30分钟shell,如果说代码写的不好请指出;没有做参数校验,那就自己用吧。

#!/bin/bash

# 该参数为传入的限定时间段
time_param1="$1"
time_param2="$2"
time_param3="$3"
time_param4="$4"


echo "参数列表============="
echo "第一次实时介入时间  : $time_param1"
echo "第一次实时停止时间  : $time_param2"
echo "第二次实时介入时间  : $time_param3"
echo "第二次实时结束时间  : $time_param4"
echo "----------------------"


# 系统当前时间,格式类型为:2019-06-26 11:33:17
now_time=$(date +"%Y-%m-%d %H:%M:%S")
echo "得到系统当前时间为:$now_time"


# 创建每天限定时间段
point_time1=$(date +"%Y-%m-%d $time_param1")
point_time2=$(date +"%Y-%m-%d $time_param2")
point_time3=$(date +"%Y-%m-%d $time_param3")
point_time4=$(date +"%Y-%m-%d $time_param4")
echo "时间区间-------==========------------"
echo "第一次实时介入时间  : $point_time1"
echo "第一次实时停止时间  : $point_time2"
echo "第二次实时介入时间  : $point_time3"
echo "第二次实时结束时间  : $point_time4"
echo "----------------------"


timestamp_now_time=`date -d "$now_time" +%s`
timestamp_point_time1=`date -d "$point_time1" +%s`
timestamp_point_time2=`date -d "$point_time2" +%s`
timestamp_point_time3=`date -d "$point_time3" +%s`
timestamp_point_time4=`date -d "$point_time4" +%s`
echo "----------------------"
echo "当前时间  : $timestamp_point_time"
echo "第一次实时介入时间  : $timestamp_point_time1"
echo "第一次实时停止时间  : $timestamp_point_time2"
echo "第二次实时介入时间  : $timestamp_point_time3"
echo "第二次实时结束时间  : $timestamp_point_time4"
echo "----------------------"

if [ $timestamp_now_time -ge $timestamp_point_time1 ] && [ $timestamp_now_time -le $timestamp_point_time2 ]; then
    echo "当前时间介于第一次任务放开时间    :   $point_time1  <   $now_time < $point_time2"
elif [ $timestamp_now_time -ge $timestamp_point_time3 ] && [ $timestamp_now_time -le $timestamp_point_time4 ]; then
    echo "当前任务开始第二次任务放开时间   :  $point_time3  <   $now_time < $point_time4 "
else
    echo "时间区间-------==========------------"
    echo "请注意,当前时间,不再任务接入时间范围内,请注意!"
    echo "程序应该执行的时间段为:"
    echo "时间区间-------==========------------"
    echo "当前时间介于第一次任务放开时间    :   $point_time1  <   $now_time < $point_time2"
    echo "当前任务开始第二次任务放开时间   :  $point_time3  <   $now_time < $point_time4 "
    echo "时间区间-------==========------------"
    echo "Do nothing."
    echo "Error:Exception:Exception has been found.job should closed."
    1=2
fi

 

可以看到,不用他做就让他报错即可。

azkaban自然会报错。

输出1=2

 

在此做版本迭代,记录于此。

 

4.注意事项

       (1)看行号

         vim 之后  esc   set number

       (2)如果上传.sh文件不行的话,注意修改一下文件的ff哦,不要忘记

      (3)请注意,shell脚本的if else需要有空格,不然会报错的。

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章