Linux环境下服务意外停止后自动拉起的设计与实现

2024-07-10 14:10:30阅读 9评论 0

引言

服务持续运行的重要性

  • 用户体验:服务的可靠性直接影响用户满意度和信任度
  • 数据完整性:服务中断可能导致正在处理的数据丢失或损坏

服务意外停止的常见原因

  • 安全攻击:如DDoS攻击或恶意软件入侵,可能导致服务停止
  • 硬件故障:物理硬件损坏,如硬盘、内存条或电源问题,可能导致服务中断
  • 其他:手动重启服务器

自动拉起机制设计

设计目标

  • 确保服务持续可用性:主要目标是确保即使出现意外情况,服务能够快速恢复并持续提供服务,从而最大程度地减少业务中断时间
  • 降低人工干预:设计一个自动化的机制,减少管理员或运维人员介入的需求,提高系统的自我修复能力
  • 快速检测和响应:目标是设计一种监控机制,可以及时检测到服务停止的情况,并快速启动恢复流程,以确保服务在最短的时间内重新运行

监控工具选择

screen的作用和优势:

  • 终端复用:screen允许在单个终端窗口中创建多个会话,即使断开连接也能保持会话运行
  • 后台运行:适合长期运行的监控任务,例如监控服务状态或执行定时任务
  • 实时监控:通过在screen会话中执行监控脚本,可以实时查看服务的运行情况和输出日志

shell脚本的编写和应用:

  • 监控脚本设计:使用shell脚本编写监控逻辑,例如检测服务运行状态、分析日志文件或响应服务异常
  • 自动化操作:设计脚本以实现自动重启服务或执行其他恢复措施
  • 灵活配置:脚本通常允许配置监控频率、报警机制及自动恢复策略,以适应不同的监控需求和环境条件

结合应用场景和优化效果:

  • 综合应用场景:将screen用于持久化监控会话,保证监控任务长期稳定运行;同时使用shell脚本定期检测服务状态,并在必要时重新启动服务
  • 优势分析:screen保证了监控任务的持续性和可视性,而shell脚本提供了灵活的监控与恢复机制,共同提升了系统的可靠性和自动化程度

实现自动拉起

screen安装

下载ncurses-6.2和screen-4.8.0

http://ftp.gnu.org/pub/gnu/ncurses/ncurses-6.2.tar.gz
http://ftp.gnu.org/gnu/screen/screen-4.8.0.tar.gz

安装

tar -zxvf ncurses-6.2.tar.gz
cd ncurses-6.2
./configure
make && make install
tar -xzvf screen-4.8.0.tar.gz
cd screen-4.8.0
./configure
make && make install

检查是否安装成功

screen --version

结果

Screen version 4.08.00 (GNU) 05-Feb-20

常用命令

1.列出所有会话

screen -ls
There is a screen on:
    12345.pts-0.hostname  (Detached)
1 Socket in /run/screen/S-username.

2.进入会话

screen -r 12345

3.创建会话

screen -S my_session

4.关闭会话

screen -X -S id(窗口id) quit

5.快捷键

  • Ctrl-a c:创建新窗口
  • Ctrl-a n:切换到下一个窗口
  • Ctrl-a p:切换到上一个窗口
  • Ctrl-a d:分离会话
  • Ctrl-a ":列出所有窗口
  • Ctrl-a 0-9:切换到指定编号的窗口
  • Ctrl-a k:关闭当前窗口
  • Ctrl-a A:重命名当前窗口

脚本编写

脚本命名为autho_restart.sh

#!/bin/bash

# Django 服务的进程名称,根据实际情况修改
PROCESS_NAME="manage.py"

# Django 服务启动命令,根据实际情况修改
START_COMMAND="sh startup.sh start"

while true
do
    # 检查 Django 服务是否运行
    if ps aux | grep "$PROCESS_NAME" | grep -v grep > /dev/null
    then
        echo "Django 服务正在运行。"
    else
        echo "Django 服务未运行,正在尝试重新启动..."
        $START_COMMAND 
        if [ $? -eq 0 ]; then
            echo "Django 服务启动成功。"
        else
            echo "Django 服务启动失败。"
        fi
    fi

    # 等待60秒
    sleep 60
done

新建会话并执行脚本

1.创建会话

screen -S django

2.连接会话

screen -r django

3.在会话中执行脚本

sh auto_restart.sh

3.退出会话

Ctrl-a d

4.修改配置文件,重启时自动创建会话并执行脚本

echo -e '\n# 检查是否在 screen 会话中\nif [ -z "$STY" ]; then\n    # 恢复之前的 screen 会话,或者创建一个新的会话\n    screen -d -r || screen -S mysessionname\n    /opt/dockerService/face-py/auto_start.sh\nfi' >> ~/.bashrc

测试与验证

执行命令停止服务

sh startup.sh stop

控制台输出

当前pid:31341
31345
Django application stopped.

查看服务状态

sh startup.sh status

控制台输出

Django application is not running.

1分钟后再次查看服务状态

sh startup.sh status

控制台输出

Django application is running with PID 3525
3529.

还没有评论,来说两句吧