• linux设置应用开机自启(通用:mysql、jar、nginx、solr...)


    1. 业务场景

    用于单机生产环境,防止服务器断电或者强制重启导致的服务下线。

    2. 实现方案

    1. 对于无状态服务,可容器部署设置 restart: alwayssystemctl eable docker
    2. 对于有状态服务,可编写自启脚本,如下
    • ① 编写执行脚本
    #!/bin/bash
    APP_NAME=saveName
    PROG_NAME=$0
    ACTION=$1
    APP_START_TIMEOUT=20    # 等待应用启动的时间
    APP_PORT=81 # 应用端口
    HEALTH_CHECK_URL=http://127.0.0.1:${APP_PORT}  # 应用健康检查URL
    APP_HOME=$(pwd) # 从package.tgz中解压出来的jar包放到这个目录下
    HEALTH_CHECK_FILE_DIR=${APP_HOME}/status   # 脚本会在这个目录下生成nginx-status文件
    JAR_NAME=${APP_HOME}/app.jar # jar包的名字
    JAVA_OUT=/dev/null  #应用的启动日志
    JAVA_HOME=${APP_HOME}/jdk-11.0.16
    # 创建出相关目录
    mkdir -p ${HEALTH_CHECK_FILE_DIR}
    #mkdir -p ${APP_HOME}
    usage() {
        echo "Usage: $PROG_NAME {start|stop|restart|init|jdk_install}"
        exit 2
    }
    jdk_install() {
    	tar zxvf ${APP_HOME}/jdk-11.0.16_linux-x64_bin.tar.gz
        tee -a /etc/profile << EOF
    	export JAVA_HOME=${APP_HOME}/jdk-11.0.16
    	export PATH=${APP_HOME}/jdk-11.0.16/bin:\$PATH
    	export CLASS_PATH=${APP_HOME}/jdk-11.0.16/lib
    EOF
    	echo "如没有jdk日志,请手动执行:source /etc/profile &java -version"
    	source /etc/profile
    	java -version
    }
    health_check() {
        exptime=0
        echo "checking ${HEALTH_CHECK_URL}"
        while true
            do
                status_code=`/usr/bin/curl -L -o /dev/null --connect-timeout 5 -s -w %{http_code}  ${HEALTH_CHECK_URL}`
                if [ "$?" != "0" ]; then
                   echo -n -e "\rapplication not started"
                else
                    echo "code is $status_code"
                    if [ "$status_code" == "401" ];then
                        break
                    fi
                fi
                sleep 5
                ((exptime++))
    
                echo -e "\rWait app to pass health check: $exptime..."
    
                if [ $exptime -gt ${APP_START_TIMEOUT} ]; then
                    echo 'app start failed'
                   exit 1
                fi
            done
        echo "check ${HEALTH_CHECK_URL} success"
    }
    start_application() {
        echo "starting java process"
        echo "nohup java -jar ${JAR_NAME} --spring.profiles.active=${env} > ${JAVA_OUT} 2>&1 &"
        nohup java -jar ${JAR_NAME} --spring.profiles.active=${env} > ${JAVA_OUT} 2>&1 &
        echo "started java process"
    }
    
    stop_application() {
       checkjavapid=`ps -ef | grep java | grep ${APP_NAME} | grep -v grep |grep -v 'deploy.sh'| awk '{print$2}'`
    
       if [[ ! $checkjavapid ]];then
          echo -e "\rno java process"
          return
       fi
    
       echo "stop java process"
       times=60
       for e in $(seq 60)
       do
            sleep 1
            COSTTIME=$(($times - $e ))
            checkjavapid=`ps -ef | grep java | grep ${APP_NAME} | grep -v grep |grep -v 'deploy.sh'| awk '{print$2}'`
            if [[ $checkjavapid ]];then
                kill -9 $checkjavapid
                echo -e  "\r        -- stopping java lasts `expr $COSTTIME` seconds."
            else
                echo -e "\rjava process has exited"
                break;
            fi
       done
       echo ""
    }
    start() {
        start_application
        health_check
    }
    stop() {
        stop_application
    }
    case "$ACTION" in
        start)
            start
        ;;
        stop)
            stop
        ;;
        restart)
            stop
            start
        ;;
        jdk_install)
            jdk_install
        ;;
        *)
            usage
        ;;
    esac
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • ① 编写自启脚本
    #!/bin/sh
    # chkconfig: 2345 20 20
    # clear file
    base=baseArg
    serveStart() {
      echo "正在启动Solr"
      cd baseArg/serve
      sh baseArg/serve/deploy.sh start
    }
    serveStart
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • ② 注册自启脚本至linux开启自动调用目录
    ACTION=$1
    usage() {
        echo "Usage: $PROG_NAME {init|stopAll}"
        exit 2
    }
    stopAll(){
    checkjavapid=`ps -ef |  grep $serveName| awk '{print$2}'`
    kill -9 $checkjavapid
    }
    init(){
    base=$(pwd)
    sed -i "s|baseArg|${base}|g" $base/autoSave.sh
    chmod 777 $base/autoSave.sh
    rm -rf /etc/init.d/autoSave.sh
    cp -rf $base/autoSave.sh /etc/init.d/autoSave.sh
    chmod 777 /etc/init.d/autoSave.sh
    chkconfig --add autoSave.sh
    chkconfig autoSave.sh on
    chkconfig --list
    }
    case "$ACTION" in
        init)
            init
        ;;
        stopAll)
            stopAll
        ;;
        *)
            usage
        ;;
    esac
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
  • 相关阅读:
    基于粒子群优化算法在配电系统中优化电容器的配置以降低损耗(Matlab代码实现)
    终于有阿里P8从开发、运维两个角度总结出了Redis实战手册
    开源项目有哪些机遇与挑战?
    从简历被拒到收割 8个大厂offer,我用2个月的时间破茧成蝶
    【ESP32-Face】ESP32人脸检测MTMN 模型以及face_detect()函数详解
    aqs源码分析
    Sentinel流量控制
    【MySQL】学习多表查询和笛卡尔积
    OceanBase数据库简单安装部署——筑梦之路
    文件系统类数据读取与保存 MySQL_大数据培训
  • 原文地址:https://blog.csdn.net/weixin_53083143/article/details/133305541