使用场景
- 我们的平台服务使用
docker
部署,使用docker-compose
进行管理 - 平台部署到客户环境时,一小部分客户,使用自己机房或单独的服务器,并没有做断电保护,有时候这台服务器会断电重启
- 断电重启后,我们的平台服务要能自动拉起来,为客户正常提供服务
- 实现思路很简单,创建一个平台维护脚本,开机启动时自动执行
- 首先把平台服务的启动过程,编写为一个shell脚本,按照一定顺序启动服务的各个组件
- 然后将此脚本,加入CentOS7的开机启动项中
平台重启脚本
- 先来讲一下平台的重启脚本
- 由于我们的平台服务使用
docker
部署的,首先需要将docker服务,加入开机自启动
systemctl enable docker
- 然后编写平台服务重启脚本
docker-restart.sh
,主要是根据自己的应用情况,搞一个启动顺序 - 主要思路是,先启动各个中间件(
PostgreSQL
、Redis
、kafka
等),再启动各个应用服务,最后再启动nginx
等其他所有未启动的服务
#!/bin/bash
cd /home
echo '当前目录为:'$(pwd)
docker network create signal-network
echo '开始重启服务'
echo '当前目录为:'$(pwd)
cd signal/instance/
docker-compose --compatibility up -d postgresql zookeeper redis portainer
echo "为保证中间件创建完成启动成功,等待5秒"
sleep 5s
echo '开始创建其他需要的容器,请稍等,可能需要几分钟'
docker-compose --compatibility up -d keycloak kafka consul consul-config-loader
sleep 15s
docker-compose --compatibility up -d gateway-app unit-app data-center-app
sleep 25s
docker-compose --compatibility up -d
sleep 15s
docker restart nginx
echo '当前目录为:'$(pwd)
echo '所有命令执行完成,请稍等1分钟后,访问ip地址,查看界面是否正常展示!'
加入开机启动
- 平台重启脚本搞好之后,就需要将这个脚本,加入到开机自启动里面
- 加入方法很多,我采用的是赋予
/etc/rc.d/rc.local
开机启动执行 权限,再在里面写一个执行平台重启脚本的命令 - 下面的一段,是加到平台服务重启脚本
docker-restart.sh
里面前几行里面的,第一次部署平台时,执行下这个脚本 - 主要逻辑:根据文件内容,判断平台重启脚本是否已加入开机启动,如果没有,则赋予执行权限并加入
if cat '/etc/rc.d/rc.local' | grep "/home/docker-restart" > /dev/null
then
echo "已加入重启脚本"
else
echo "将docker服务重启加入服务器重启脚本"
chmod +x /etc/rc.d/rc.local
chmod +x /home/docker-restart.sh
cat >>/etc/rc.d/rc.local<<EOF
sh /home/docker-restart.sh &
EOF
fi
- 注意:在CentOS 7中,系统默认不加载
/etc/rc.d/rc.local
文件,需要手动添加开机启动项来启动该文件。所以有了这一行,chmod +x /etc/rc.d/rc.local
,保证文件正常加载和执行
脚本内容详解
-
docker-restart.sh
就是一个普通的shell脚本,脚本里都是最基础的一些命令 - 我下面把我的脚本里用到的一些函数简单介绍下,包括自己踩得一些坑
判断文件内容是否包含某字符串
- 这个命令很好用,防止执行脚本的命令重复加到开机启动里面
cat '/etc/rc.d/rc.local' | grep "/home/docker-restart" > /dev/null
cat 'file path and name' | grep "your str" > /dev/null
- 主要使用
cat
和grep
,前面是文件路径和名称,我用的绝对路径;后面是要查找的字符串 - 然后再进行判断
> /dev/null
,包含则为true,不包含为false
给文件添加可执行权限
-
chmod +x /etc/rc.d/rc.local
这句命令会给/etc/rc.d/rc.local
文件添加可执行权限 - 赋予权限后,在系统启动时,系统会自动执行该文件中的命令
- 通过给该文件添加可执行权限,可以实现开机自启动某些自定义命令或服务
- 但是请注意,该操作需要谨慎处理,避免不必要的安全风险或系统故障
给文件结尾添加内容
- 主要是用这几句命令,在
/etc/rc.d/rc.local
文件最后面追加我们的平台重启脚本的执行命令 - 主要使用
cat
写入
cat >>/etc/rc.d/rc.local<<EOF
sh /home/docker-restart.sh &
EOF
-
sh
后面加&
,是为了后台启动,不影响开机速度
根据内容删除文件的指定行
- 查找删除很有用,可以帮我维护
/etc/rc.d/rc.local
文件的内容,修复错加的命令语句 - 在早期部署时,重启脚本还不完善,在
/etc/rc.d/rc.local
添加了错误内容 - 例如:应该是添加
sh /home/docker-restart.sh &
,结果使用相对位置,错加了sh /root/docker-restart.sh &
,而文件在home目录下,开机启动时执行不到,服务就没有重启 - 还有的客户机器配置比较差,服务启动过程较慢,一开始写入
/etc/rc.d/rc.local
的是sh /home/docker-restart.sh
,没有后面加&
,导致系统一直在启动中,客户看到进度卡死(实际上在启动平台)又去重启 - 因为客户都是内网环境,也没有专业运维,给客户更新部署时,是提供自带脚本的部署包。客户上传文件,执行脚本即可,让客户去使用命令改文件,有点困难
- 需要一个命令,查找指定行,并删除,这个也有很多方法,我使用的是
sed
if cat '/etc/rc.d/rc.local' | grep "docker-restart" > /dev/null
then
sed -i '/docker-restart/d' /etc/rc.d/rc.local
fi
echo "将docker服务重启加入服务器重启脚本"
chmod +x /etc/rc.d/rc.local
chmod +x $(pwd)/docker-restart.sh
cat >>/etc/rc.d/rc.local<<EOF
sh $(pwd)/docker-restart.sh &
EOF
文章来源地址https://www.toymoban.com/news/detail-511643.html
文章来源:https://www.toymoban.com/news/detail-511643.html
到了这里,关于Linux:将服务重启脚本加入CentO7的开机启动里的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!