苏溪云
服务和脚本保活方案

目前很多类似技术问题问ai基本能够解决,但有时也要结合实际业务场景,看是否满足需求,若不满足,需自己研究最佳方案。

保活一般用linux自带特性systemd、常见工具supervisor和pm2等和原生脚本实现。这里着重写一下原生脚本实现方案,因为这种方案不依赖第三方工具,兼容性好(比如systemd在centos6下不受支持)。

保活的原理就是定时检测服务是否存活,不存活则重启。

简单保活脚本方案

最简单粗暴但管用方案:循环中隔一段时间执行保活判断逻辑。

示例目标:保活/my_program二进制服务。

示例方案:开机执行下方保活脚本

#!/bin/bash
while true; do
  programNum=$(ps -ef|grep -v grep|grep "/my_program"|wc -l)
  echo [$(date +%Y-%m-%d_%H:%M:%S)] programNum:$programNum
  if [ $programCountStr -eq 0 ]; then
    nohup /my_program >> /my_program.out 2>&1 &
  fi
  sleep 60
done

crontab方案

linux默认支持crontab(linux自带周期执行任务工具)。用crontab定时执行脚本即可实现保活目标。

相比于原生单脚本持续执行,此方案优点是借助系统自带crontab实现双重保活保险。

示例目标:保活/my_program二进制服务。

示例方案:运行一次双重保活脚本即可,脚本如下:

#!/bin/bash
# 先保活crontab定时任务
crontabRule="*/1 * * * * /my_program"
matchedCrontabNum=$(crontab -l|grep -F "$addingCrontabRule"|wc -l)
echo matchedCrontabNum:$matchedCrontabNum
if [ $matchedCrontabNum -eq 0 ]; then
  crontab -l > /tmp-crontab
  echo [$(date +%Y-%m-%d_%H:%M:%S)] "$matchedCrontabNum" >> /tmp-crontab
  crontab /tmp-crontab
  rm -rf /tmp-crontab
  crontab -l
fi

# 再保活目标程序
programNum=$(ps -ef|grep -v grep|grep "/my_program"|wc -l)
echo [$(date +%Y-%m-%d_%H:%M:%S)] programNum:$programNum
if [ $programCountStr -eq 0 ]; then
  nohup /my_program >> /my_program.out 2>&1 &
fi

感谢你的阅读。欢迎通过微信(扫描下方二维码)或Github订阅我的博客。

微信公众号:苏溪云的博客

发布时间: 2025/7/26
分类: 技术\后端\通用\service-and-script-keep-alive-solution.m
作者版权所有,转载请注明出处,禁止商业转载