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. 打印项目启动日志

先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  

相关推荐