Jenkins总结3-shell脚本

 

  我写shell脚本的功力还很初级,基本都是现学现卖,写得不是很健壮,只能提供个思路,请大家包涵。

  我使用的系统只能发函数放到shell最前面。本人还是比较推崇函数式脚本的,方便复用,目前只简单的封装了两个。

  1. 判断jar包是否运行,在项目停机前,启动后都可以用到。

# 判断jar包是否正在运行
is_exist(){
    pid=`ps -ef | grep $JAR_NAME | grep -v grep | awk '{print $2}'`
    if [ -n "$pid" ]; then
        return 0
    else
        return 1
    fi
}

  2. 停止项目

# 停止程序
stop(){
    pid=`ps -ef | grep $JAR_NAME | grep -v grep | awk '{print $2}'`
    if [ -n "$pid" ]; then
        echo '停止pid='$pid
        kill $pid > /dev/null 2>&1
        count=`ps --no-heading -C java -f --width 2000 | grep $JAR_NAME | awk '{print $2}' | wc -l`
        if [ $count -gt 0 ]; then
            # 等5秒,尽量让程序优雅停机,之后再强制杀死进程
            sleep 5
            kill -9 $pid > /dev/null 2>&1
            sleep 1
        fi
    fi
}

  3. 判断参数数量,并接受参数。我这个脚本有2个参数,第二个参数在后面直接用$2使用。

# 接收参数, 项目名称
if [[ $# == 2 ]]; then
    PROJECT_NAME=$1
    echo '接收到的项目名称参数='$PROJECT_NAME
else
    echo '参数不全,无法执行!!!'
    exit 1
fi

  4. 接下来可以提前名称项目目录,并拼接项目jar目录,日志目录等。

  5. 启动项目。$2是脚本的第二个参数,内存数量,单位M,$JAR_PATH是拼接好的jar包全路径。 并使用nohup后台运行。因为前台运行jar命令会造成jenkins会一直打印部署日志,shell脚本不能退出,最终jenkins部署超时。

nohup /usr/local/java/bin/java -Xms$2m -Xmx$2m -jar $JAR_PATH > $OUT 2>&1 &

  6. 打印项目启动日志(方式1)

  这个方法简单粗暴,在前面执行完java命令之后,等待一段时间,我这里设置的是50秒,然后调用is_exist函数判断线程是否启动,之后打印判断结果和最后100行的启动日志。

  会打印一些多余的日志,如果项目打印日志太快可能是看不到启动日志的。

# 等待50秒,再判断程序是否启动
sleep 50
is_exist
# 打印启动日志
if [ $? -eq 0 ]; then
    echo $JAR_NAME'发布成功!请查看日志'
    tail -100 $LOG_FILE
    exit 0
else
    echo $JAR_NAME'发布失败!请查看日志'
    tail -100 $LOG_FILE
    exit 1
fi

   7. 打印项目启动日志(方法2)

  获取当前系统的日期和小时,$LOG_FILE是我日志文件路径,循环grep判断日志中是否出现了启动成功的关键字“started successfully”,如果超过45秒还没有提示超时。

  待完善的地方:因为判断时间只精确到小时,如果一小时内项目重启多次,可能只会打印其中一次的日志,并不一定是最新的。如果精确时间到分钟,在项目启动时时间如果跨了分钟,有可能会判断不到。

  最后一行是输出启动日志“Initializing ProtocolHandler”是我项目启动的第一行日志,判断从这一行开始打印向下100行日志。

today=`date +%Y-%m-%d`
hour=`date +%H`

seconds=0
while [ -f $LOG_FILE ]
do
    result=`grep "$today $hour" $LOG_FILE | grep "started successfully"`
    if [ -n "$result" ]; then
        echo "项目已启动........."
        break
    else
        echo "启动中.......已耗时$seconds秒"
        sleep 1s
        let seconds+=1;
    fi
    if [ ${seconds} -ge 45 ]; then
        echo "启动超时,45秒,自动退出";
        break;
    fi
done
echo $JAR_NAME"启动成功"
# 打印启动日志
grep "$today $hour" $LOG_FILE | grep -A 100 'Initializing ProtocolHandler'

 

started successfully

posted @ 2020-06-01 11:12  闲人鹤  阅读(1274)  评论(0编辑  收藏  举报