Background

以Redis服务为例,该shell脚本可以通过传入不同的参数实现服务的启动、停止、服务运行状态查看、服务运行日志查看和进入服务shell命令界面等功能。

直接上脚本operator.sh

用法可以使用help参数查看哈,用法例如:
先赋执行权限chmod +x operator.sh 查看帮助命令operator.sh help

#!/bin/bash  
#  
# 服务基本信息
operate=$1
ps_1='./redis-server'
pid_1=`ps -ef | egrep "$ps_1" | egrep -v grep | awk '{print $2}'`
dir_home=/usr/redis/
dir_log=/usr/redis/redis-server.log
host_redis=localhost
port_redis=6377

# 判断输入参数
if [[ -z $operate || $operate = "help" ]]; then
    echo '#####'
    echo "please input your operate [run|stop|status|log|shell]"
    echo '#####'
fi

# 启动服务
if [[ $operate = "run" || $operate = "start" ]]; then
    rm -rf $dir_log
    nohup $dir_home/bin/redis-server $dir_home/redis.conf >> $dir_log 2>&1 &

# 停止服务
elif [[ $operate = "stop" ]]; then
    kill -9 $pid_1

# 查看服务运行状态
elif [[ $operate = "status" ]]; then
    if [[ $pid_1 ]]; then
        # 黄底蓝字
        echo -e "\033[43;34m RUNNING \033[0m"
    else
        # 蓝底黑字
        echo -e "\033[44;30m STOPPED \033[0m"
    fi

# 查看服务运行日志
elif [[ $operate = "log" ]]; then
    if [[ -e $dir_log ]]; then
        tail -f $dir_log
    else
        echo '#####'
        echo "No logs have been generated so far"
        echo '#####'
    fi

# 进入服务命令行界面
elif [[ $operate = "shell" ]]; then
    if [[ $pid_1 ]]; then
        $dir_home/bin/redis-cli -h $host_redis -p $port_redis
    else
        echo '#####'
        echo "The redis service has not been started yet"
        echo '#####'
    fi
fi

分割线


Background

鉴于上面的脚本挺受欢迎哈(至少在我的所有博客中访问量算较高的),这里再给一个操作jar包服务的脚本,也是集启动、停止、重启、日志查看等功能于一体,使用非常方便,这是自己在日常使用中不断完善的,若有好的建议和方法,欢迎不吝赐教哈。

直接上脚本operator-jar.sh

用法可以使用help参数查看哈,并且在脚本中也进行了相关使用说明。

#!/bin/bash

:<<!
【此脚本用法说明】
1、此脚本适用操作jar包服务;
2、哪个项目使用只需要在jar所在目录执行【ln -s /usr/bin/operate.sh operate.sh】。
!

# 服务操作参数
operate=$1

# 服务基本信息
homedir=$(pwd)
app=$(ls *.jar)
#appsuffix=${app#*${project}}

# 获取项目名【去掉后缀-1.0-SNAPSHOT.jar的部分】
function get_project(){
    declare -a seplist
    j=0
    for i in `seq ${#app}`
    do
        char=${app:$i-1:1}
        if [[ $char = '-' ]]; then
            seplist[$j]=$i
            j=$j+1
        fi
    done
    # 排序
    len=${#seplist[@]}
    for((i=0; i<$len; i++)){
      for((j=i+1; j<$len; j++)){
        if [[ ${seplist[i]} -gt ${seplist[j]} ]]
        then
          temp=${seplist[i]}
          seplist[i]=${seplist[j]}
          seplist[j]=$temp
        fi
      }
    }
    # 取出倒数第二个"-"的索引
    size=${#seplist[*]}
    index=$(expr $size - 2)
    idx=$(expr ${seplist[$index]} - 1)
    # 获取项目名
    project=${app:0:${idx}}
    echo $project
}

# 项目名称
project=$(get_project)

# 日志
logname=$(ls logs/*.log)
logdir=$homedir/$logname

# 进程
pid=`ps -ef | egrep "$app" | egrep -v grep | awk '{print $2}'`

# 定制化shell输出
function customize_shell_out(){
    echo -e "\033[5;34m ***** \033[0m"
    echo -e "\033[32m $@ ! \033[0m"
    echo -e "\033[5;34m ***** \033[0m"
}

# 判断输入参数
if [[ -z $operate || $operate = "help" ]]; then
    # 请输入操作参数
    msg='Please input the param [start|stop|restart|status|log]'
    customize_shell_out $msg

# 启动服务
elif [[ $operate = "run" || $operate = "start" ]]; then
    if [[ $pid ]]; then
        # 服务正在运行中
        msg='The service is already running'
        customize_shell_out $msg
    else
        cd $homedir/
        nohup java -jar $app > /dev/null 2>&1 &
        msg='Start success'
        customize_shell_out $msg
    fi

# 重启服务
elif [[ $operate = "restart" ]]; then
    if [[ $pid ]]; then
        kill -9 $pid
        cd $homedir/
        nohup java -jar $app > /dev/null 2>&1 &
    else
        cd $homedir/
        nohup java -jar $app > /dev/null 2>&1 &
    fi
    msg='Restart success'
    customize_shell_out $msg

# 停止服务
elif [[ $operate = "stop" ]]; then
    if [[ $pid ]]; then
        kill -9 $pid
        msg='Stopped success'
        customize_shell_out $msg
    else
        # 服务早已停止或未启动
        msg='The service is already down'
        customize_shell_out $msg
    fi

# 查看服务运行状态
elif [[ $operate = "status" ]]; then
    if [[ $pid ]]; then
        # 黄底蓝字
        msg='RUNNING'
        customize_shell_out $msg
    else
        # 蓝底黑字
        echo -e "\033[5;34m ***** \033[0m"
        echo -e "\033[31m STOPPED ! \033[0m"
        echo -e "\033[5;34m ***** \033[0m"
    fi

# 查看服务运行日志
elif [[ $operate = "log" ]]; then
    if [[ -e $logdir ]]; then
        tail -f $logdir
    else
        # 尚未生成日志
        msg='No log has been generated yet'
        customize_shell_out $msg
    fi

# 参数输入有误
else
    msg='Please input the correct param [start|stop|restart|status|log]'
    customize_shell_out $msg
fi

使用实例

下图是我实际中的脚本的使用。
说明:

  • 所有项目部署在/root/projects目录下
  • 每个项目部署的目录需要和项目名称相同(为了不再修改脚本)
  • 每个项目下都有一个operate.sh脚本,每个脚本中只有项目名称不同。

xshell脚本在redis中写入大量数据 xshell查看redis_jar


xshell脚本在redis中写入大量数据 xshell查看redis_redis_02