麒麟部署平台应用启动和停止脚本模板

Linux服务器

如果应用运行的目标服务器是Linux环境的,则参考如下脚本示意


应用启动脚本模板

#!/bin/bash
#######  单进程软件包安装脚本模版说明  #########
#1. 此脚本默认在根路径下执行 Linux系统默认为 /root
#2. 脚本安装软件执行成功后 默认会删除远程下载的路径
#3. 用户自定义实现 建议在 user_shell 下
#4. 需遵循进程ID的存储约束 软件包进程ID标识需存储到指定路径

#######  error code specification  #########
# Please update this documentation if new error code is added.
# 1   => install fail
# 2   => check health fail
# 3   => record process id fail
# 4   => user shell fail

# 用户部署物名称&软件包名称 由使用方基于页面填写
DEPLOY_NAME="demo"
SOFTWARE_NAME="demo-1.0.0-SNAPSHOT.jar"


APP_HOME="/etc/aliyun"
PROCESS_ID_PATH="${APP_HOME}/main_process_id"


user_shell() {
    #用户自定义安装脚本 START
    #软件包会自动拉取到实例 “~” 路径下,脚本成功后软件包会自动删除 
    #用户自行决定是否需要先把软件包转移位置
    #此处以jar类型软件包为例,后台进程保持运行
    cp ${SOFTWARE_NAME} ${APP_HOME}
    nohup java -jar ${APP_HOME}/${SOFTWARE_NAME} > /dev/null 2>&1 &
    #用户自定义安装脚本 END
}

##### 禁止修改
##### 可在脚本开始运行时调用,打印当时的时间戳及PID,同时记录软件包进程ID到指定路径。
job_start() {
    if [[ -e ${PROCESS_ID_PATH} ]]; then
        startProcessId=`sed  -n /"${DEPLOY_NAME}:${SOFTWARE_NAME}"/,+1p  ${PROCESS_ID_PATH} | grep -iv [a-z]`
        kill -9 ${startProcessId} 
        sed -i /${SOFTWARE_NAME}/,+1d ${PROCESS_ID_PATH}
        sed -i /${SOFTWARE_NAME}/d ${PROCESS_ID_PATH}
        echo "old process ${startProcessId} in ${APP_HOME}, killed."
    fi
    mkdir -p ${APP_HOME}
    user_shell
    if [ $? -ne 0 ]; then
        exit4 #user shell fail
    fi
    # 此处约束禁止删除
    pid=$!
    echo "process start success in ${APP_HOME}, pid: ${pid}."
    echo "${DEPLOY_NAME}:${SOFTWARE_NAME}" >> "${PROCESS_ID_PATH}"
    echo "${pid}" >> "${PROCESS_ID_PATH}"
    if [ $? -ne 0 ]; then
        exit3 #record process id fail
    fi
}

##### 在此函数中检查服务是否起来,可以是检查进程,curl http地址等方式
check_health() {
    now=$(date +'%Y-%m-%d %H:%M:%S')
    #自定义健康检查逻辑
    result=`curl http://localhost:7001/checkpreload.htm|grep success`
    if [[ "$result" -eq "" ]]; then
        echo "[$now][$$] check_health"
    else 
        exit2 #check health fail
    fi
}

exit1() {
  echo "exit code 1, install fail"
  exit 1
}
exit2() {
  echo "exit code 2, check health fail"
  exit 2
}
exit3() {
  echo "exit code 3, record process id fail"
  exit 3
}
exit4() {
  echo "exit code 4, user shell fail"
  exit 4
}
exit5() {
  echo "exit code 5, jdk not effect fail"
  exit 5
}

##### 如果返回值为0,则认为此执行成功,如果非0,则认为执行失败
main() {
    job_start
    check_health
}

##### 触发执行 日志由OOS自动记录
main


应用停止脚本模板


#!/bin/bash

##### 可在脚本开始运行时调用,打印当时的时间戳及PID。
PID_FILE_PATH="/etc/aliyun/main_process_id"
DEPLOY_NAME="demo"
SOFTWARE_HOME="demo-1.0.0-SNAPSHOT.jar"

FLAG=0
function job_stop()
{
    for line in `cat ${PID_FILE_PATH}`
    do
        if [[ ${FLAG} == 1 ]]; then
            kill -9 $line
            FLAG=0
            sed -i /${SOFTWARE_HOME}/,+1d ${PID_FILE_PATH}
            sed -i /${SOFTWARE_HOME}/d ${PID_FILE_PATH}
        fi
        if [[ $line == "${DEPLOY_NAME}:${SOFTWARE_HOME}" ]]; then
            FLAG=1
        fi
    done
}

job_stop




Windows服务器

如果应用运行的目标服务器是Windows环境的,则参考如下脚本示意

@echo off

REM ####### 单进程软件包安装脚本模版说明 #######
REM 1.  windows C:\Users\Administrator 
REM 2. user_shell
REM 3. ID ID

REM ##### 如果返回值为0,则认为此执行成功,如果非0,则认为执行失败
call :main
exit /b %ERRORLEVEL%
REM ##### 触发执行 日志由OOS自动记录

REM ############### 用户可修改区域 开始 ###############

REM 使 [!!  !!]
:user_conf
    
    SET DEPLOY_NAME=
    SET SOFTWARE_NAME=
    REM /y/n
    SET RETURN=y

goto :eof

REM 
REM  C:\Windows\system32 
REM 
:user_shell
    echo 

    REM /y/n
    SET RETURN=n
goto :eof

REM ##### 在此函数中检查服务是否起来,可以是检查进程,curl http地址等方式
:check_health
    
    REM /y/n
    SET RETURN=y
goto :eof

REM ############### 用户可修改区域 结束 ###############



REM ############### 以下内容禁止修改 ###############

REM 1   => install fail
REM 2   => check health fail
REM 3   => record process id fail
REM 4   => user shell fail

REM ############### 可在脚本开始运行时调用,打印当时的时间戳及PID,同时记录软件包进程ID到指定路径 ###############
:main

    SET RETURN=n

    call :user_conf
    echo user_conf %RETURN%
    if %RETURN%==n echo "exit code 3, record process id fail" && exit /b 3

    echo %DEPLOY_NAME%-%SOFTWARE_NAME%-%DATE%-%TIME% > C:\main_process_id

    call :user_shell
    echo usershell %RETURN%
    if %RETURN%==n echo "exit code 4, user shell fail" && exit /b 4

    call :check_health
    echo check_health %RETURN%
    if %RETURN%==n echo "exit code 2, check health fail" && exit /b 2

    if %RETURN%==y echo "exit code 0, run deploy script success " && exit /b 0

goto :eof
上一篇:为ECS实例添加下载OSS部署包的权限


下一篇:如何快速获取集合(array/string/typescript)倒数第N个元素