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
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脚本的更多相关文章
- jenkins+gitlab钩子+shell脚本基于git的tag实现App增量更新
转自:http://blog.csdn.net/kingboyworld/article/details/54175330 环境安装 jdk1.8 1.安装jenkins 首先到https://jen ...
- jenkins:执行远程shell脚本时,脚本没有生效
问题: jenkins远程部署一台机器时,jenkins构建显示成功,但是查看服务日志却没有真正执行的sh run.sh脚本,导致服务并没有启动 解决: 只需要在命令最上方加上source /etc/ ...
- jenkins中使用shell脚本必须切换jenkins用户
https://blog.csdn.net/cdnight/article/details/81078191 安装这篇解决的 正确使用脚本的方式: 1.脚本必须使用jenknins用户,且所有命令必须 ...
- 【jenkins】jenkins实时显示python脚本输出
jenkins在构建shell脚本时可以实时输出结果,但是在构建python脚本时,是等到python执行完成以后,才显示结果,这个对于我们判断脚本执行状态非常不利 这里介绍一种方法,能够实时显示py ...
- Jenkins远程执行shell出现java: command not found
之前在使用Jenkins执行远程shell脚本时,出现提示java: command not found:多方查找原因后发现是因为远程执行shell脚本时,不会自动加载环境变量,导致出现此错误,解决方 ...
- Jenkins结合shell脚本实现(gitLab/gitHub)前端项目自动打包部署服务器
原始发布部署: 石器时代的我们,先是本地打包好项目,在去服务器上把原来的文件删了,然后回到本地copy到服务器: 这操看起来简单,实际部署的人就知道多烦了,假如来几个项目都要重新发布:那就爽了: 今天 ...
- jenkins中shell脚本编写的两个注意点
在jenkins的build中,如果用shell脚本的话,要记住有两个地方要注意 1.由于默认jenkins是使用/bin/bash -xe xxx.sh来调用脚本的,所以不同于日常写的脚本,任何一行 ...
- 解决Jenkins用shell脚本部署后,Jenkins自动杀掉启衍生出来的守护进程
Jenkins部署java项目遇到的问题: 1.Jenkins执行构建后,需要手动执行startup.sh,站点才能正常访问 产生原因: shell脚本发布时,会衍生进程,Jenkins默认会自动杀掉 ...
- jenkins自动部署应用到tomcat中,编译后shell脚本的简单示例
jenkins的安装这里就不做描述了,很简单的 百度搜索一下即可 这里安装的jenkins-2.39-1.1 wget http://pkg.jenkins-ci.org/redhat/jenkin ...
- 自动化部署-从maven到shell脚本到jenkins
Java代码自动部署 [ ①Java代码自动部署-总结简介] 代码部署是每一个软件开发项目组都会有的一个流程,也是从开发环节到发布功能必不可少的环节.对于Java开发者来说,Java代码的发布部署也是 ...
随机推荐
- Java基础笔记01-02-03-04
一.今日内容介绍 1.Java开发环境搭建 2.HelloWorld案例 3.注释.关键字.标识符 4.数据(数据类型.常量) 01java语言概述 * A: java语言概述 * a: Java是s ...
- C#利用反射实现简单记事本功能插件
效果图: 源码下载:https://github.com/doyoulaikeme/DotNetSample
- 机器学习实战基础(四十一):随机森林 (八)附录 Bagging vs Boosting
- JavaScript 对象的创建和操作
<script> // 对象是属性的无序集合,每个属性都是一个名/值对. 属性名称是一个字符串. // 对象种类 // 内置对象(nativ ...
- 在 CentOS 7(Linux)上部署ASP.NET Core 2.2 Web应用程序(Tengine、Asp.Net Core MVC、Centos 7、MySql)
一.前言 1.简单记录一下Linux CentOS 7中安装与配置Tengine的详细步骤. 2.简单比较一下Tengine 和Nginx 3.搭建Asp.net Core和部署 Web程序 4.总结 ...
- 《python编程从入门到实践》2.3字符串
书籍<python编程从入门到实践> 2.3字符串 知识模块 print()函数,函数名称突出为蓝色,输出括号内的变量或者字符创. 变量名的命名:尽量小写字母加下划线并且具有良好的描述性, ...
- Ordinary - 官方原版软件下载站
官网:http://a-1.vip/exe/
- 波士顿动力狗 SPOT 权威购买指北
两周前 油管科技视频播主 Lew Later 发布了一支 波士顿动力狗子的开箱视频,短短两周的时间内这支视频的播放量就达到了367万, 在Lew Later 近期发布的视频中,这支视频的播放量绝对算得 ...
- Asp.Net Core 附加进程调试
第一种:VS调试 vs打开项目,F5启动调试 第二种:附加到w3wp.exe进程调试 一.安装NET Core Windows Server Hosting软件包 安装 .NET Core 托管捆绑包 ...
- [jvm] -- 常用内存参数配置篇
新生代 ( Young ) 与老年代 ( Old ) 的比例的值为 1:2 ( 该值可以通过参数 –XX:NewRatio 来指定 ) Eden : from : to = 8 : 1 : 1 ( 可 ...