目前很多类似技术问题问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
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订阅我的博客。