我写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. A*算法求K短路模板 POJ 2449

    #include<cstdio> #include<queue> #include<cstring> using namespace std; const int ...

  2. 调整数组顺序使奇数位于偶数前面(剑指offer-13)

    方法1:新建两个数组,一个数组用来放奇数,一个数组用来放偶数,最后再把它们合并起来. 1 import java.util.*; 2 public class Solution { 3 public ...

  3. [JAVA]SpringBoot中让接口支持跨域

    官方原文:https://spring.io/blog/2015/06/08/cors-support-in-spring-framework ===抽空翻译 最简单办法:在方法上增加注解: @Cro ...

  4. 关于点击input框唤醒键盘导致input被遮盖的问题

    关于点击input框唤醒键盘导致input被遮盖的问题 这个问题相信大家在实际开发过程当中都有遇见,我自己也遇见过很多次.之前在百度上看见大多数的方法利用的都是键盘唤醒了之后,页面的实际高度会发生变化 ...

  5. day49 数据库终章

    目录 一.pymysql补充 二.数据库补充 1 视图(了解) 2 触发器(了解) 3 事务 4 存储过程(了解) 5 函数 6 流程控制 7 索引 8 b+树 9 聚集索引(primary key) ...

  6. Scala 基础(六):Scala变量 (三) 标识符

    1 标识符概念 1) Scala 对各种变量.方法.函数等命名时使用的字符序列称为标识符 2) 凡是自己可以起名字的地方都叫标识符 2 标识符的命名规则 Scala中的标识符声明,基本和Java是一致 ...

  7. 机器学习实战基础(三十六):随机森林 (三)之 RandomForestClassifier 之 重要属性和接口

    重要属性和接口 至此,我们已经讲完了所有随机森林中的重要参数,为大家复习了一下决策树的参数,并通过n_estimators,random_state,boostrap和oob_score这四个参数帮助 ...

  8. 数据可视化之DAX篇(二十四)Power BI应用技巧:在总计行实现条件格式

    https://zhuanlan.zhihu.com/p/98975646 如何将表格或者矩阵中值的条件格式也应用于总计行? 目前PowerBI并不支持这种功能,无法在总计行或者小计行上应用条件格式, ...

  9. jquery 选项卡切换、选项卡封装、简单的jquery选项卡封装、tab切换效果

    相信选项卡切换是大家常用的效果单独写一个选项卡切换很方便但是要是一个页面出现多个选项卡不做封装的话会显得代码很杂乱 <div class="bodyCenter"> & ...

  10. C++代码规约--命名约定

    目录 通用命名规则 文件命名 类型命名 变量命名 常量命名 函数命名 宏命名 枚举命名 命名空间命名 命名规则的特例 学习自Google C++编程规约 通用命名规则 函数命名, 变量命名, 文件命名 ...