我写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
is_exist
# 打印启动日志
if [ $? -eq ]; then
echo $JAR_NAME'发布成功!请查看日志'
tail - $LOG_FILE
exit
else
echo $JAR_NAME'发布失败!请查看日志'
tail - $LOG_FILE
exit
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

Jenkins总结3-shell脚本的更多相关文章

  1. jenkins+gitlab钩子+shell脚本基于git的tag实现App增量更新

    转自:http://blog.csdn.net/kingboyworld/article/details/54175330 环境安装 jdk1.8 1.安装jenkins 首先到https://jen ...

  2. jenkins:执行远程shell脚本时,脚本没有生效

    问题: jenkins远程部署一台机器时,jenkins构建显示成功,但是查看服务日志却没有真正执行的sh run.sh脚本,导致服务并没有启动 解决: 只需要在命令最上方加上source /etc/ ...

  3. jenkins中使用shell脚本必须切换jenkins用户

    https://blog.csdn.net/cdnight/article/details/81078191 安装这篇解决的 正确使用脚本的方式: 1.脚本必须使用jenknins用户,且所有命令必须 ...

  4. 【jenkins】jenkins实时显示python脚本输出

    jenkins在构建shell脚本时可以实时输出结果,但是在构建python脚本时,是等到python执行完成以后,才显示结果,这个对于我们判断脚本执行状态非常不利 这里介绍一种方法,能够实时显示py ...

  5. Jenkins远程执行shell出现java: command not found

    之前在使用Jenkins执行远程shell脚本时,出现提示java: command not found:多方查找原因后发现是因为远程执行shell脚本时,不会自动加载环境变量,导致出现此错误,解决方 ...

  6. Jenkins结合shell脚本实现(gitLab/gitHub)前端项目自动打包部署服务器

    原始发布部署: 石器时代的我们,先是本地打包好项目,在去服务器上把原来的文件删了,然后回到本地copy到服务器: 这操看起来简单,实际部署的人就知道多烦了,假如来几个项目都要重新发布:那就爽了: 今天 ...

  7. jenkins中shell脚本编写的两个注意点

    在jenkins的build中,如果用shell脚本的话,要记住有两个地方要注意 1.由于默认jenkins是使用/bin/bash -xe xxx.sh来调用脚本的,所以不同于日常写的脚本,任何一行 ...

  8. 解决Jenkins用shell脚本部署后,Jenkins自动杀掉启衍生出来的守护进程

    Jenkins部署java项目遇到的问题: 1.Jenkins执行构建后,需要手动执行startup.sh,站点才能正常访问 产生原因: shell脚本发布时,会衍生进程,Jenkins默认会自动杀掉 ...

  9. jenkins自动部署应用到tomcat中,编译后shell脚本的简单示例

    jenkins的安装这里就不做描述了,很简单的  百度搜索一下即可 这里安装的jenkins-2.39-1.1 wget http://pkg.jenkins-ci.org/redhat/jenkin ...

  10. 自动化部署-从maven到shell脚本到jenkins

    Java代码自动部署 [ ①Java代码自动部署-总结简介] 代码部署是每一个软件开发项目组都会有的一个流程,也是从开发环节到发布功能必不可少的环节.对于Java开发者来说,Java代码的发布部署也是 ...

随机推荐

  1. JVM 学习笔记(一)

    一:jvm架构图解 我们经常关注的jdk和jre如图所示: jre包含在jdk中,这里说一下jdk和jre的作用 JRE是Java Runtime Environment的缩写,是Java程序的运行环 ...

  2. 数据可视化基础专题(十四):pyecharts 基础(一)简单上手

    1.引言 文档位于 https://pyecharts.org/#/zh-cn/intro 示例位于 https://gallery.pyecharts.org/#/README echarts 官网 ...

  3. 机器学习实战基础(十七):sklearn中的数据预处理和特征工程(十)特征选择 之 Embedded嵌入法

    Embedded嵌入法 嵌入法是一种让算法自己决定使用哪些特征的方法,即特征选择和算法训练同时进行.在使用嵌入法时,我们先使用某些机器学习的算法和模型进行训练,得到各个特征的权值系数,根据权值系数从大 ...

  4. It's time for Django

    本节内容 Django流程介绍 Django url Django view Django models Django template Django form Django admin Django ...

  5. Django框架05 /orm单表操作

    Django框架05 /orm单表操作 目录 Django框架05 /orm单表操作 1. orm使用流程 2. orm字段 3. orm参数 4. orm单表简单增/删/改 5. orm单表查询 5 ...

  6. Unity-ECS-实践

    Archetypes原型 (它的存在使得遍历组件的命中率非常高) Archetype是一个容器,Unity规定每个ArcheType的大小16kb,不够就再开.始终保存内存的连续性 World 世界 ...

  7. bzoj1528[POI2005]sam-Toy Cars*&&bzoj1826[JSOI2010]缓存交换

    bzoj1528[POI2005]sam-Toy Cars bzoj1826[JSOI2010]缓存交换 题意: Jasio有n个不同的玩具,它们都被放在了很高的架子上,地板上不会有超过k个玩具.当J ...

  8. 软件测试工程师入门——Linux【使用说明书】

    先来说一下linux是什么? linux 是一个开源.免费的操作系统,其稳定性.安全性.处理多并发已经得到业界的认可,目前很多中性,大型甚至是巨型项目都在使用linux. linux 内核:redha ...

  9. Python Ethical Hacking - KEYLOGGER(3)

    Object-Oriented Programming Keylogger Classes Way of modeling program(blueprint). Logically group fu ...

  10. 牛客练习赛 66C公因子 题解

    原题 原题 思路 考场想复杂了,搞到自闭-- 实际上,因为差值不变,我们可以先差分,求\(\gcd\),便得到答案(考场时想多了,想到了负数.正数各种复杂的处理,但是不需要),最后处理一下即可 代码 ...