记一次写Java项目启动管理脚本

最近将大概每天三分之一的精力放到了改造Ambry上(改造后的叫AmbryX,项目地址),Ambry原来最蛋疼的一点就是居然没有启动shell脚本和终止shell脚本,对于运维太不友好了。昨天下午做了个Ambry的启动管理脚本,并且推到了github上,记录下写的思路。

首先,确定下需求。

需求

网上有一个标准的java启动脚本模板,感觉上和我的需求不太符合。他的脚本一个机器上限制只能启动一个JVM进程,我的不是这样,Ambry可能在同一个机器上启动多个JVM进程,每个JVM进程的主类不一样的。我们可能需要在同一台机器上启动Ambry-Server,Ambry-Frontend,Ambry-Admin,并且需要在启动脚本里面指定启动配置。每个进程需要的配置文件不一样,而且每中进程可能启动多个,每个进程的配置文件也不一样。我们需要提供一个启动脚本,提供如下功能:

  1. 指定启动Ambry-Server,Ambry-Frontend或者Ambry-Admin,在启动时,指定启动的配置文件。为了方便,我们扫描指定的目录(这里是打包目录的conf目录下)
  2. 查看当前机器上的Ambry-Server,Ambry-Frontend或者Ambry-Admin进程
  3. 停止当前机器上的某个Ambry-Server,Ambry-Frontend或者Ambry-Admin进程

设计与实现

首先,是否要拆分脚本。如果要拆分脚本,那么肯定需要设置环境变量或者传递变量。对于我们这个系统来说,由于脚本不是很长,每个系统重合的地方很多。所以不需要拆分增加复杂度。

对于基本变量,我们需要如下几个:

我们部署文件包的目录结构是:

--ambry-release
|--bin目录:存放脚本目录
|--conf目录:存放配置文件目录
|--lib目录:存放库文件目录
|--logs目录:存放日志目录
#利用cd `dirname $0`切换到脚本当前目录,$0代表脚本文件,pwd获取目录绝对路径
BIN_DIR=$(cd `dirname $0`;pwd)
#获取项目根目录
DEPLOY_DIR=$(cd $BIN_DIR;cd ..;pwd)
CONF_DIR=$DEPLOY_DIR/conf
LIB_DIR=$DEPLOY_DIR/lib
LIB_JARS=`ls $LIB_DIR|grep .jar|awk ‘{print "‘$LIB_DIR‘/"$0}‘|tr "\n" ":"`
LOG_DIR=$DEPLOY_DIR/logs

总结下知识点:

  1. 获取脚本目录不能直接pwd,因为这时的pwd返回的是用户操作指令时所处于的目录。我们需要利用cddirname $0;先进行切换在获取pwd

对于JVM配置,调试用,测试用还有生产配置不一样。但是我们不需要在脚本中引导用户去选,为了保持脚本的纯洁性,我们在启动脚本时,传入是否是测试的参数,来决定这个脚本启动的JVM进程是否是测试用。

主要是如下参数:

#远程JVM监控
JVM_DEBUG_OPTS=" -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n "
#JMX监控
JVM_JMX_OPTS=" -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false "
#在最小内存配置下运行
JVM_MEM_OPTS=" -server -Xmx256m -Xms128m "

在生产配置下运行时:

#在合适的内存配置,适合的GC策略下运行(禁止代码中显示调用GC,年老带并发回收(因为是对象存储,最近存储的利用率高,过一段时间利用率低,慢慢进入年老带),页内存调大存储大对象,多层编译)
JVM_MEM_OPTS=" -server -Xmx2g -Xms1g -Xmn64m -XX:PermSize=64m -Xss256k -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 "

如果启动脚本时传入参数debug,则JVM_DEBUG_OPTS=" -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n ",如果传入jmx,则JVM_JMX_OPTS=" -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false ",如果传入minMem,则JVM_MEM_OPTS=" -server -Xmx256m -Xms128m ",JVM_MEM_OPTS默认是-server -Xmx2g -Xms1g -Xmn64m -XX:PermSize=64m -Xss256k -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70

利用shell脚本实现:

#读取传入参数,遍历
for arg in $*
do
    #参数debug,则激活debug参数
    if [ "debug"x = "$arg"x ]
    then
        echo "In debug mode!"
        JVM_DEBUG_OPTS=" -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n "
    #参数为jmx,则激活jmx参数
    elif [ "jmx"x = "$arg"x ]
    then
        echo "Enable JMX!"
        JVM_JMX_OPTS=" -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false "
    #参数为minMem,则修改JVM_MEM_OPTS参数
    elif [ "minMem"x = "$arg"x ]
    then
        echo "In min memory mode!"
        JVM_MEM_OPTS=" -server -Xmx256m -Xms128m "
    fi
done

之后设计主菜单,主菜单包括三个:

  1. 启动服务
  2. 查看当前机器服务列表
  3. 停止服务

进入启动服务的话,用户需要选择是:

  1. Ambry-Server
  2. Ambry-Frontend
  3. Ambry-Admin

选择好后,用户需要指定配置文件:

请指定system.properties文件(以下文件列表为conf目录下的文件):

1. admin.properties

2. frontend.properties

3. HardwareLayout.json

4. log4j.properties

5. PartitionLayout.json

6. server.properties

之后,请指定hardwareLayout(以下文件列表为conf目录下的文件):

1. admin.properties

2. frontend.properties

3. HardwareLayout.json

4. log4j.properties

5. PartitionLayout.json

6. server.properties

之后,请指定partitionLayout(以下文件列表为conf目录下的文件):

1. admin.properties

2. frontend.properties

3. HardwareLayout.json

4. log4j.properties

5. PartitionLayout.json

6. server.properties

指定好配置文件后,启动,并将输出打印到日志文件,监控日志文件,直到出现关键字判断成功与否。

如果是选择的查看当前机器服务列表,那么继续选择是:

  1. Ambry-Server
  2. Ambry-Frontend
  3. Ambry-Admin

之后会展示列表。

如果选择的是停止服务,那么先查看当前机器服务列表,之后选择要停止的服务。

由于shell脚本限制,我们必须将被调用的函数放在脚本前面位置,否则会报找不到的错误。

首先我们可以抽象出如下几个函数:

由于停止服务首先需要展示服务列表,所以showServer会调用stopServer。bootServer会先调用specifyConfiguration来指定配置文件,之后运行java,最后利用watchBootstrap确认是否启动成功。

首先来实现specifyConfiguration,这个函数的功能就是帮助用户指定配置文件:

specifyConfiguration(){
    echo "which is the server properties(please put your configuration files in the configuration folder:${CONF_DIR})?"
    #利用``执行ls命令获取CONF_DIR目录下的所有文件
    configurations=`ls ${CONF_DIR}`
    #遍历返回,展示文件列表
    count=1
    #注意,shell脚本语法很严格,for do done不能在同一行,如果要在同一行,则需要加;
    for var in $configurations
    do
        echo "${count}. ${var}"
        count=`expr $count + 1`
    done
    echo -n "Please input the sequence number of the Configuration for server properties: "
    #获取用户选择的文件
    read number
    count=1
    for var in $configurations
    do
        #注意,shell脚本语法很严格,if then fi,如果要在同一行,则需要加;
        #这里已经确保了count不为空,如果输入为空则会报错
        #注意,if 后面的 [ 条件 ] 之间的空格是必须的
        if [ $count -eq $number ]
        then
            SYS_PROPERTIES="--serverPropsFilePath ${CONF_DIR}/${var}"
        fi
        count=`expr $count + 1`
    done
    count=1
    for var in $configurations
    do
        echo "${count}. ${var}"
        count=`expr $count + 1`
    done
    echo -n "Please input the sequence number of the Configuration for hardwareLayout: "
    #获取用户选择的文件
    read number
    count=1
    for var in $configurations
    do
        if [ $count -eq $number ]
        then
            SYS_CLUSTER_PARA="--hardwareLayoutFilePath ${CONF_DIR}/${var}"
        fi
        count=`expr $count + 1`
    done
    count=1
    for var in $configurations
    do
        echo "${count}. ${var}"
        count=`expr $count + 1`
    done
    echo -n "Please input the sequence number of the Configuration for partitionLayout: "
    #获取用户选择的文件
    read number
    count=1
    for var in $configurations
    do
        if [ $count -eq $number ]
        then
            SYS_CLUSTER_PARA="${SYS_CLUSTER_PARA} --partitionLayoutFilePath ${CONF_DIR}/${var}"
        fi
        count=`expr $count + 1`
    done
}

总结如下几点知识点:

  1. 注意,shell脚本语法很严格,顺序逻辑语法关键字不要放在同一行
  2. 该有的空格必须有(例如[ expression ]),不该有的不要加(例如变量赋值的=两边)

接下来实现watchBootstrap:

watchBootstrap () {
    ret=0;
    while [ $ret -eq 0 ]
    do
        #因为每种类型的日志如果成功日志最后一行都是包含Server start,所以根据这个来判断是否启动成功
        #注意指定了日志文件的文职和目录,所以待会java 启动命令最后需要加上 > ${LOG_DIR}/stdout.out
        output=`cat ${LOG_DIR}/stdout.out|grep "Server start"`
        if [[ $output != "" ]]
        then
            ret=1
        else
            #因为有任意异常日志最后一行都是包含Server shutdown,所以根据这个来判断是否启动成功
            output=`cat ${LOG_DIR}/stdout.out|grep "Server shutdown"`
            if [[ $output != "" ]]
            then
                 ret=2
            fi
        fi
        sleep 1
        echo -ne "."
    done
    if [ $ret -eq 2 ]
    then
        echo -e "\n************************Failed to start $1!************************\n"
        cat ${LOG_DIR}/stdout.out
    else
        echo -e "\n************************$1 started!************************\n"
    fi
}

总结如下知识点:

  1. 我们启动Java进程一般后台启动,这时需要知道启动成功与否,我们可以在编写Java代码,在启动时加入特殊输出来表示是否启动成功。
  2. 在shell脚本中,我们可以将启动的标准输出指定到一个文件中输出。之后我们不断用cat命令来查找关键字来判断是否启动成功(注意,设置好延迟,一般1秒cat一次)。

接下来实现bootServer :

bootServer () {
    echo -e "\n************************Please specify the module you want to start:************************\n"
    echo "1. Ambry-Server"
    echo "2. Ambry-Frontend"
    echo "3. Ambry-Admin"
    echo -n "Your selection is(input 1,2 or 3):"

    read MODULE
    echo ""
    case $MODULE in
    1)
        specifyConfiguration
        echo "Starting Ambry-Server"
        # 2>&1 代表(0是标准输入,1是标准输出,2是标准错误输出)将标准错误输出也输出到标准输出,末尾的 &代表后台启动,> ${LOG_DIR}/stdout.out代表将所有标准输出输出到文件${LOG_DIR}/stdout.out中
        java $JVM_DEBUG_OPTS $JVM_JMX_OPTS $JVM_MEM_OPTS $JVM_PARAS -classpath $CONF_DIR:$LIB_JARS com.github.ambry.server.AmbryMain ${SYS_PROPERTIES} ${SYS_CLUSTER_PARA} > ${LOG_DIR}/stdout.out 2>&1 &
        watchBootstrap "Ambry-Server"
        echo -e "\n************************************************************************\n"
        ;;
    2)
        specifyConfiguration
        echo "Starting Ambry-Frontend"
        java $JVM_DEBUG_OPTS $JVM_JMX_OPTS $JVM_MEM_OPTS $JVM_PARAS -classpath $CONF_DIR:$LIB_JARS  com.github.ambry.frontend.AmbryFrontendMain ${SYS_PROPERTIES} ${SYS_CLUSTER_PARA} > ${LOG_DIR}/stdout.out 2>&1 &
        watchBootstrap "Ambry-Frontend"
        echo -e "\n************************************************************************\n"
        ;;
    3)
        specifyConfiguration
        echo "Starting Ambry-Admin"
        java $JVM_DEBUG_OPTS $JVM_JMX_OPTS $JVM_MEM_OPTS $JVM_PARAS -classpath $CONF_DIR:$LIB_JARS  com.github.ambry.admin.AdminMain ${SYS_PROPERTIES} ${SYS_CLUSTER_PARA} > ${LOG_DIR}/stdout.out 2>&1 &
        watchBootstrap "Ambry-Admin"
        echo -e "\n************************************************************************\n"
        ;;
    esac
}

总结如下知识点:

  1. 2>&1 代表(0是标准输入,1是标准输出,2是标准错误输出)将标准错误输出也输出到标准输出,末尾的 &代表后台启动,> ${LOG_DIR}/stdout.out代表将所有标准输出输出到文件${LOG_DIR}/stdout.out中

实现了这些,stopServer还有showServer就很简单了,这里放上整个脚本:

#!/bin/bash
# Author : Hash Zhang

# Constants definition:
#利用cd `dirname $0`切换到脚本当前目录,$0代表脚本文件,pwd获取目录绝对路径
BIN_DIR=$(cd `dirname $0`;pwd)
#获取项目根目录
DEPLOY_DIR=$(cd $BIN_DIR;cd ..;pwd)
CONF_DIR=$DEPLOY_DIR/conf
LIB_DIR=$DEPLOY_DIR/lib
LIB_JARS=`ls $LIB_DIR|grep .jar|awk ‘{print "‘$LIB_DIR‘/"$0}‘|tr "\n" ":"`
LOG_DIR=$DEPLOY_DIR/logs
JVM_PARAS=" -Dlog4j.configuration=file:${CONF_DIR}/log4j.properties "
JVM_DEBUG_OPTS=""
JVM_JMX_OPTS=""
JVM_MEM_OPTS=" -server -Xmx2g -Xms1g -Xmn64m -XX:PermSize=64m -Xss256k -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 "
SYS_PROPERTIES=""
SYS_CLUSTER_PARA=""
#读取传入参数,遍历
for arg in $*
do
    #参数debug,则激活debug参数
    if [ "debug"x = "$arg"x ]
    then
        echo "In debug mode!"
        JVM_DEBUG_OPTS=" -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n "
    #参数为jmx,则激活jmx参数
    elif [ "jmx"x = "$arg"x ]
    then
        echo "Enable JMX!"
        JVM_JMX_OPTS=" -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false "
    #参数为minMem,则修改JVM_MEM_OPTS参数
    elif [ "minMem"x = "$arg"x ]
    then
        echo "In min memory mode!"
        JVM_MEM_OPTS=" -server -Xmx256m -Xms128m "
    fi
done

watchBootstrap () {
    ret=0;
    while [ $ret -eq 0 ]
    do
        #因为每种类型的日志如果成功日志最后一行都是包含Server start,所以根据这个来判断是否启动成功
        #注意指定了日志文件的文职和目录,所以待会java 启动命令最后需要加上 > ${LOG_DIR}/stdout.out
        output=`cat ${LOG_DIR}/stdout.out|grep "Server start"`
        if [[ $output != "" ]]
        then
            ret=1
        else
            #因为有任意异常日志最后一行都是包含Server shutdown,所以根据这个来判断是否启动成功
            output=`cat ${LOG_DIR}/stdout.out|grep "Server shutdown"`
            if [[ $output != "" ]]
            then
                 ret=2
            fi
        fi
        sleep 1
        echo -ne "."
    done
    if [ $ret -eq 2 ]
    then
        echo -e "\n************************Failed to start $1!************************\n"
        cat ${LOG_DIR}/stdout.out
    else
        echo -e "\n************************$1 started!************************\n"
    fi
}

specifyConfiguration(){
    echo "which is the server properties(please put your configuration files in the configuration folder:${CONF_DIR})?"
    #利用``执行ls命令获取CONF_DIR目录下的所有文件
    configurations=`ls ${CONF_DIR}`
    #遍历返回,展示文件列表
    count=1
    #注意,shell脚本语法很严格,for do done不能在同一行,如果要在同一行,则需要加;
    for var in $configurations
    do
        echo "${count}. ${var}"
        count=`expr $count + 1`
    done
    echo -n "Please input the sequence number of the Configuration for server properties: "
    #获取用户选择的文件
    read number
    count=1
    for var in $configurations
    do
        #注意,shell脚本语法很严格,if then fi,如果要在同一行,则需要加;
        #这里已经确保了count不为空,如果输入为空则会报错
        #注意,if 后面的 [ 条件 ] 之间的空格是必须的
        if [ $count -eq $number ]
        then
            SYS_PROPERTIES="--serverPropsFilePath ${CONF_DIR}/${var}"
        fi
        count=`expr $count + 1`
    done
    count=1
    for var in $configurations
    do
        echo "${count}. ${var}"
        count=`expr $count + 1`
    done
    echo -n "Please input the sequence number of the Configuration for hardwareLayout: "
    #获取用户选择的文件
    read number
    count=1
    for var in $configurations
    do
        if [ $count -eq $number ]
        then
            SYS_CLUSTER_PARA="--hardwareLayoutFilePath ${CONF_DIR}/${var}"
        fi
        count=`expr $count + 1`
    done
    count=1
    for var in $configurations
    do
        echo "${count}. ${var}"
        count=`expr $count + 1`
    done
    echo -n "Please input the sequence number of the Configuration for partitionLayout: "
    #获取用户选择的文件
    read number
    count=1
    for var in $configurations
    do
        if [ $count -eq $number ]
        then
            SYS_CLUSTER_PARA="${SYS_CLUSTER_PARA} --partitionLayoutFilePath ${CONF_DIR}/${var}"
        fi
        count=`expr $count + 1`
    done
}

bootServer () {
    echo -e "\n************************Please specify the module you want to start:************************\n"
    echo "1. Ambry-Server"
    echo "2. Ambry-Frontend"
    echo "3. Ambry-Admin"
    echo -n "Your selection is(input 1,2 or 3):"

    read MODULE
    echo ""
    case $MODULE in
    1)
        specifyConfiguration
        echo "Starting Ambry-Server"
        # 2>&1 代表(0是标准输入,1是标准输出,2是标准错误输出)将标准错误输出也输出到标准输出,末尾的 &代表后台启动,> ${LOG_DIR}/stdout.out代表将所有标准输出输出到文件${LOG_DIR}/stdout.out中
        java $JVM_DEBUG_OPTS $JVM_JMX_OPTS $JVM_MEM_OPTS $JVM_PARAS -classpath $CONF_DIR:$LIB_JARS com.github.ambry.server.AmbryMain ${SYS_PROPERTIES} ${SYS_CLUSTER_PARA} > ${LOG_DIR}/stdout.out 2>&1 &
        watchBootstrap "Ambry-Server"
        echo -e "\n************************************************************************\n"
        ;;
    2)
        specifyConfiguration
        echo "Starting Ambry-Frontend"
        java $JVM_DEBUG_OPTS $JVM_JMX_OPTS $JVM_MEM_OPTS $JVM_PARAS -classpath $CONF_DIR:$LIB_JARS  com.github.ambry.frontend.AmbryFrontendMain ${SYS_PROPERTIES} ${SYS_CLUSTER_PARA} > ${LOG_DIR}/stdout.out 2>&1 &
        watchBootstrap "Ambry-Frontend"
        echo -e "\n************************************************************************\n"
        ;;
    3)
        specifyConfiguration
        echo "Starting Ambry-Admin"
        java $JVM_DEBUG_OPTS $JVM_JMX_OPTS $JVM_MEM_OPTS $JVM_PARAS -classpath $CONF_DIR:$LIB_JARS  com.github.ambry.admin.AdminMain ${SYS_PROPERTIES} ${SYS_CLUSTER_PARA} > ${LOG_DIR}/stdout.out 2>&1 &
        watchBootstrap "Ambry-Admin"
        echo -e "\n************************************************************************\n"
        ;;
    esac
}

stopServer (){
    count=1
    pids=$1
    for var in $pids
    do
        echo "${count}. ${var}"
        count=`expr $count + 1`
    done
    if [ -n "$2" -a $count -gt 1 ]
    then
        echo -n "Please input the sequence number of the PID you want to stop: "
        read pid
        count=1
        for var in $pids
        do
            if [ $count -eq $pid ]
            then
                ret=`kill -9 "${var}"`
                echo $ret
            fi
            count=`expr $count + 1`
        done
    elif [ $count -lt 2 ]
    then
        echo "No Alive Ambry-Server exists!"
    fi
}

showServer () {
    echo ""
    echo "1. Ambry-Server"
    echo "2. Ambry-Frontend"
    echo "3. Ambry-Admin"
    echo -n "Your selection is(input 1,2 or 3):"
    read MODULE
    echo ""
    case $MODULE in
    1)
        pids=`ps -ef|grep ambry|grep "${DEPLOY_DIR}"|grep com.github.ambry.server.AmbryMain|awk ‘{print $2}‘`
        echo -e "\n************************Current Ambry-Server Pids:************************\n"
        stopServer $pids $1
        echo -e "\n************************************************************************\n"
        ;;
    2)
        pids=`ps -ef|grep ambry|grep "${DEPLOY_DIR}"|grep com.github.ambry.frontend.AmbryFrontendMain|awk ‘{print $2}‘`
        echo -e "\n************************Current Ambry-Frontend Pids:************************\n"
        stopServer $pids $1
        echo -e "\n************************************************************************\n"
        ;;
    3)
        pids=`ps -ef|grep ambry|grep "${DEPLOY_DIR}"|grep com.github.ambry.admin.AdminMain|awk ‘{print $2}‘`
        echo -e "\n************************Current Ambry-Admin Pids:************************\n"
        stopServer $pids $1
        echo -e "\n************************************************************************\n"
        ;;
    esac
}

while [ 1 = 1 ]
do
    echo -e "\n************************Welcome to ambry!************************\n"
    echo "1. Boot a server"
    echo "2. Watch the server list in current host"
    echo "3. Stop a server"
    echo -n "Your selection is(input 1,2 or 3):"
    read SELECTION
    echo ""
    case $SELECTION in
    1)
        bootServer
        ;;
    2)
        showServer
        ;;
    3)
        showServer true
        ;;
    esac
done

时间: 2024-08-06 20:05:26

记一次写Java项目启动管理脚本的相关文章

2015年9月28日作业(请写出项目范围管理论文的提纲)

作业内容:请写出项目范围管理论文的提纲 项目概述 (1)介绍项目基本情况 (2)项目范围管理的定义和目的 (3)介绍项目范围管理主要经过范围规划.范围定义.创建WBS.范围确认.范围控制 范围规范 (1)介绍项目章程.项目的初步范围说明书.项目管理计划 (2)制定项目范围管理计划的方法与过程 (3)简要介绍项目范围管理计划 范围定义 (1)制定项目范围说明书 (2)项目范围说明书应包含的内容说明 创建WBS (1)创建WBS的方法 (2)项目的基线 范围确认 (1)范围确认的定义及输入 (2)范

redis启动管理脚本

亲测好用的redis启动管理脚本,如果使用需要根据自己安装的redis相关文件进行调整 我是源码安装的redis-3.0.5 安装路径/usr/local/redis 编辑创建脚本文件: vim /etc/init.d/redis #!/bin/sh # # chkconfig:   2345 85 15   # description: this script can manager the redis-server daemon #              Redis is a persi

Java项目启动时执行指定方法的几种方式

1.使用 @PostConstruct,作用于方法上面. @Componentpublic class PostConstruct { @PostConstruct public void test() { System.out.println("PostConstruct:开始运行..."); }} 2.使用 ApplicationRunner. @Componentpublic class Start implements CommandLineRunner { @Override

java项目的部署脚本

记得两年前实习的时候,继哥说,一个程序员如果把一些范畴内的事情做得完美,其他人会少很多事情,包括测试,运维,方便自己,方便大家..这次有机会将一个项目进行重构,并进行前后端分离,分析了一些需求和后期的规划后,决定放弃以前“肥大”的springMVC那一套东西,采用近两年越来越火的微服务架构试一试,当然,首当其冲的就是采用spring-boot来担当重任了.前期的需求都已经完成,本次测试通过(强烈建议java程序员们自己写好单元测试,这将使我们后面的开发和维护变得简单,虽然前期可能要花点功夫,但是

记一次spring boot项目启动时的依赖循环

奇怪的是在我Ubuntu的机器上打包到测试服务器上报错,而从另外一台windows机器打包时就没问题,刚开始还以为是maven和jdk的问题.报错的启动时日志如下: 2019-06-14 14:03:45,644 org.springframework.boot.diagnostics.LoggingFailureAnalysisReporter [main] (LoggingFailureAnalysisReporter.java:38) DEBUG --> Application faile

编程代写代做|C代写|C++代写|Java项目代写|Matlab代写|VB代写|项目代做

详细资料请查阅:置顶文章   专业,高效,原创 国内TOP5高校计算机工程师个人代写 QQ(24小时在线): 1926742804 如紧急可发送资料到:[email protected] 我的网站:http://daixiecplusplus.sxl.cn/

tengine/nginx服务启动管理脚本(未使用系统funtions函数)

tengine是淘宝对于nginx1.6.2的一个二次开发,性能比原生态nginx更好,这几天在做测试,想应用到现有的架构里.源码包安装后就牵涉到一个添加到系统服务方便管理问题,到网上搜nginx启动脚本一大堆,但不是自己写的总归不放心,再者好多用的是系统的/etc/rc.d/init.d/funtions函数来实现的,虽然看着很健壮,但想到出了问题后又得研究怎么排查,一不做二不休干脆写一个,把脚本和添加到系统服务的过程分享一下. 功能主要有:service tengine start serv

Nagios中用于nrpe的启动管理脚本

最近一段时间应为需要大量的调整修改Nagios的监控策略所以需要反复的重启nrpe,但是在Nagios安装后是没有提供nrpe的启动脚本,所以就自己顺手写了一个用于平时nrpe的重启: #!/bin/sh #The startup script for nrpe #Author:jim #processname:nrped # chkconfig:  2345 97 03 #description:This is a daemon used for nrpe startup management

转:如何将 Java 项目转换成 Maven 项目

如何将 Java 项目转换成 Maven 项目 本文内容 Java 项目 Maven 项目 Java 项目转换成 Maven 项目 本文主要介绍如何将 Java 项目转换成 Maven 项目.首先要明确的是,用 Maven 管理 Java 项目的确方便.它带给你直观的方便是:你不用在网上找 Jar 包,然后把它复制到 lib 目录,再在项目中引用它.而只需向 pom.xml 写入你需要的 Jar 包依赖,Maven 就能自动从本地仓库或远程仓库下载,并引用-- 如何将一般的 Java 项目转换成