Linux环境下服务意外停止后自动拉起的设计与实现
引言
服务持续运行的重要性
- 用户体验:服务的可靠性直接影响用户满意度和信任度
- 数据完整性:服务中断可能导致正在处理的数据丢失或损坏
服务意外停止的常见原因
- 安全攻击:如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.还没有评论,来说两句吧
