我写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. 打印项目启动日志
先sleep1秒,因为如果java程序响应比较慢,会造成日志信息判断失误的情况。
$LOG_FILE是拼接好的项目日志路径,使用tail -f打印日志,并循环读取到line变量。
echo $line 是把脚本输出到控制台。
grep ‘started successfully!‘ 用来判断是否出现项目启动成功的标识。“‘started successfully”是我在项目里写死的,每个项目启动时都有会这句话。
发现的话就改变变量flag的状态。并在每次循环是判断flag,符合条件就退出脚本。
注意:我本来也想在第一个if代码块里直接break,但经常失效,耽误了几天都没有解决,所以退一步使用了这个办法。
sleep 1
# 打印项目启动日志
flag=1
tail -f $LOG_FILE | while read line
do
echo $line
echo $line | grep ‘started successfully!‘ >> /dev/null
if [ $? -eq 0 ]; then
echo $JAR_NAME‘发布成功 !‘
flag=0
fi
if [ $flag -eq 0 ]; then
echo ‘退出脚本‘
break;
fi
done