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
脚本,每个脚本中只有项目名称不同。