背景
当我们开发完程序后,会将成果物部署在linux环境上运行(生产环境一般是centos7),势必会遇到服务器重启、停电、服务内部异常挂掉等因素导致我们之前部署的服务无法在环境恢复后自动恢复,因此为了实现生产环境中单机服务的高可用,需将服务设置为开机自启动,并定时检测服务存活状态,不存活就拉起。
整体思路
编写shell 脚本
按脚本职责可大体分为两类:安装脚本和执行脚本
安装脚本负责将服务注册到开机任务中,同时配置系统定时任务定期检测并拉取服务
安装脚本(nacos-install.sh)功能(以nacos开源组件为例)
1)环境变量添加(如果需要)
前提条件:如果没有JAVA环境,还需要配置JDK环境变量
#!/bin/bash
# 初始化方法,添加nacos安装路径到系统环境变量
. /etc/profile
NACOS_HOME=`pwd`
init_nacos_path(){
#删除已有的任务
sed -i "/.*NACOS_PATH*./d" /etc/profile
#添加环境变量
echo "export NACOS_PATH=$NACOS_HOME" >> /etc/profile
echo "export PATH=\$NACOS_PATH:\$PATH" >> /etc/profile
source /etc/profile
}
2)系统服务添加,实现服务开机自启动和systemctl命令操作
system_init_task(){
echo "[Unit]
Description=nacos server
After=network.target
[Service]
Type=forking
ExecStart=${NACOS_HOME}/nacos.sh start
ExecStop=${NACOS_HOME}/nacos.sh stop
ExecReload=${NACOS_HOME}/nacos.sh restart
[Install]
WantedBy=multi-user.target
" > /usr/lib/systemd/system/nacos.service
chmod 777 /usr/lib/systemd/system/nacos.service
systemctl enable nacos.service
# systemctl daemon-reload
systemctl start nacos.service
}
生成【服务名称.service】还有其他方式,比如给定一个模板,通过sed工具将里面的值替换,然后拷贝到/usr/lib/systemd/system/下并赋予执行权限
# 模板
[Unit]
Description=placeholder
After=network.target
[Service]
Type=forking
Restart=no
KillMode=control-group
ExecStart=placeholder
ExecStop=placeholder
ExecReload=placeholder
[Install]
WantedBy=multi-user.target
sed -i "2c Description=NACOS server" ${NACOS_HOME}/template.service
sed -i "9c ExecStart=${NACOS_HOME}/nacos.sh start" ${NACOS_HOME}/template.service
sed -i "10c ExecStop=${NACOS_HOME}/nacos.sh stop" ${NACOS_HOME}/template.service
sed -i "11c ExecReload=${NACOS_HOME}/nacos.sh restart" ${NACOS_HOME}/template.service
cp ${NACOS_HOME}/template.service /usr/lib/systemd/system/nacos.service
3)添加定时任务到crontab,定时检测服务进程是否存活,不存活则拉起进程
这里通过shell将任务规则写入到/etc/crontab中,任务触发的是执行脚本
#定时任务
schedule_task(){
#删除已有的任务
sed -i "/.*nacos*./d" /etc/crontab
#添加新的启动任务
echo "* * * * * root $NACOS_PATH/nacos.sh start" >> /etc/crontab
}
执行脚本(nacos.sh)功能(以nacos开源组件为例)
1)环境变量引入(如果需要)
#!/bin/bash
#引入环境变量文件
. /etc/profile
NACOS_HOME=$NACOS_PATH
2)服务状态查询,查询服务进程是否存在
status(){
is_nacos_exist
if [ $? -eq 1 ]
then
#nacos pid不存在,返回1
echo "NACOS has stopped!"
return 1
else
#nacos pid存在,返回0
echo "NACOS is running, pid: $NACOS_PID"
return 0
fi
}
is_nacos_exist(){
#启动naocs
NACOS_PID=`$JAVA_HOME/jps | grep nacos | awk '{print $1}'`
if [ -z $NACOS_PID ]
then
#nacos pid不存在,返回1
return 1
else
#nacos pid存在,返回0
return 0
fi
}
3)服务启动,如果已经启动就提示已启动
start() {
is_nacos_exist
if [ $? -eq 1 ]
then
echo "NACOS is starting..."
#启动naocs
$NACOS_HOME/bin/startup.sh -m standalone >> $NACOS_HOME/nacos.out 2>&1
START_CODE=$?
if [ $START_CODE -eq 0 ]
then
echo "NACOS start success!"
else
echo "NACOS start failed!"
fi
else
echo "NACOS is running, pid: $NACOS_PID"
fi
}
4)服务停止,通过kill杀死进程
stop(){
is_nacos_exist
if [ $? -eq 0 ]
then
#停止nacos
$NACOS_HOME/bin/shutdown.sh >> $NACOS_HOME/nacos.out 2>&1
STOP_CODE=$?
echo "NACOS is stopping!"
if [ $STOP_CODE -eq 0 ]
then
echo "NACOS stop success!"
else
echo "NACOS stop failed!"
fi
else
echo "NACOS has stopped!"
fi
exit 0
5)服务重启,先服务停止后服务启动
restart(){
stop
sleep 3
start
}
命令操作方式
1)输入jps可查看当前服务进程
2)systemctl [start | status | restart] 服务名称.service
3 ) 任意路径下【服务名称.sh [start | status | restart]】
特性
1)自动化安装运行
2)服务开机自启动
3)服务保活(看门狗)