Linux:将应用服务的重启脚本加入CentO7的开机启动里,实现断电重启服务自启动

使用场景

  • 我们的平台服务使用docker部署,使用docker-compose进行管理
  • 平台部署到客户环境时,一小部分客户,使用自己机房或单独的服务器,并没有做断电保护,有时候这台服务器会断电重启
  • 断电重启后,我们的平台服务要能自动拉起来,为客户正常提供服务
  • 实现思路很简单,创建一个平台维护脚本,开机启动时自动执行
  • 首先把平台服务的启动过程,编写为一个shell脚本,按照一定顺序启动服务的各个组件
  • 然后将此脚本,加入CentOS7的开机启动项中

平台重启脚本

  • 先来讲一下平台的重启脚本
  • 由于我们的平台服务使用docker部署的,首先需要将docker服务,加入开机自启动
systemctl enable docker
  • 然后编写平台服务重启脚本docker-restart.sh,主要是根据自己的应用情况,搞一个启动顺序
  • 主要思路是,先启动各个中间件(PostgreSQLRediskafka等),再启动各个应用服务,最后再启动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
  • 主要使用catgrep,前面是文件路径和名称,我用的绝对路径;后面是要查找的字符串
  • 然后再进行判断 > /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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

坚持是一种态度

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值