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  

 

Jenkins总结3-shell脚本

上一篇:linux如何查看端口被哪个进程占用,并杀死相关进程?


下一篇:TCPListener.AcceptTcpClient阻塞进程退出方法