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