服务或脚本在运行过程中可能会因程序异常、服务器重启、掉电等情况而停止运行,如果不能及时恢复运行,会给线上业务造成损失。您可以通过云助手插件ecs-tool-servicekeepalive
,使服务或脚本在被中断时快速恢复运行,保障服务的可靠性和持续性。
方案原理
该方案是基于Linux操作系统的systemd service服务实现的。启用插件ecs-tool-servicekeepalive
时,用户只需输入服务/程序的启动命令(例如,python /home/root/main.py
)。启用后,该插件会根据用户输入的启动命令,自动生成systemd service配置,实现服务或脚本自启动,无需您手动配置systemd service。
systemd service是Linux系统中的一个组件,可以用来自动管理服务,例如实现开机自启动和服务意外停止后自启动等。详细介绍,请参见systemd官方文档。
方案实践
完成服务或程序等部署后,以root权限启动云助手插件
ecs-tool-servicekeepalive
。以root用户运行服务/脚本
sudo acs-plugin-manager --exec --plugin ecs-tool-servicekeepalive --params "start,'cmd'"
cmd:需替换为服务启动命令。例如,脚本执行命令(
/bin/bash /home/work/debug/debug.sh
)、程序运行命令(python /home/root/main.py
)等。重要脚本或程序文件路径需为根路径。
通过指定用户运行服务/脚本
sudo acs-plugin-manager --exec --plugin ecs-tool-servicekeepalive --params "start,execstart='cmd',user=user_name,group=group_name"
cmd:需替换为服务启动命令。例如,脚本执行命令(
/bin/bash /home/work/debug/debug.sh
)、程序运行命令(python /home/root/main.py
)等。重要脚本或程序文件路径需为根路径。
user_name:替换为服务运行的用户名。执行
cut -d: -f1 /etc/passwd
可查看已创建的用户。group_name:替换为服务运行的用户组名。执行
cut -d: -f1 /etc/group
可查看已创建的用户组。
执行以下命令,查看服务是否已被配置为自恢复。
sudo acs-plugin-manager --exec --plugin ecs-tool-servicekeepalive --params "status"
类似如下回显,表示配置成功。
(可选)如果您需要取消服务/脚本自恢复,可执行如下命令。
sudo acs-plugin-manager --exec --local --plugin ecs-tool-servicekeepalive --params "stop service_name"
service_name:替换为已配置的服务配置名称(即步骤2回显中的service_name列)。
应用示例
准备环境。
创建一个
/home/work/debug
文件夹,并在该文件夹下创建debug.sh
脚本,该脚本会每秒打印一行日志到用户指定的日志文件中。sudo mkdir -p /home/work/debug && \ sudo tee /home/work/debug/debug.sh > /dev/null << 'EOF' #!/bin/bash while true do sudo echo "$(date '+%Y-%m-%d %H:%M:%S') progress is alive" >> $1 sleep 1 done EOF
通过命令
ps aux |grep debug.sh
,发现脚本并未运行。启动云助手插件。
sudo acs-plugin-manager --exec --plugin ecs-tool-servicekeepalive --params "start,'/bin/bash /home/work/debug/debug.sh /home/work/debug/debug.log'"
此时通过命令
ps aux | grep debug.sh
查看,发现脚本已经在运行(此时进程号为2572)。验证脚本是否会自动恢复运行。
重启ECS脚本正常运行
在控制台重启ECS实例,ECS恢复后,登录实例,执行如下命令。
ps aux |grep debug.sh
发现服务
debug.sh
的进程仍正常运行,且进程号更新为764,说明脚本被重新启动过。Kill进程脚本正常运行
执行如下命令,通过查找到
debug.sh
的进程号。ps aux |grep debug.sh
类似如下回显,2572即为
debug.sh
进程号。执行如下命令,kill掉
debug.sh
进程。sudo date && kill -9 进程号
再次执行如下命令,发现
debug.sh
仍在运行且进程号更新为4220,说明脚本被重新启动过。ps aux |grep debug.sh
相关文档
随着业务规模的增长,数据请求和并发访问量增大、您可以部署多台ECS搭建一个具备可用区级别的故障灾备能力的服务,保障数据的可用性和持续性。具体操作,请参见部署高可用架构。