diff --git a/scripts/README.md b/scripts/README.md new file mode 100644 index 0000000..a1a3501 --- /dev/null +++ b/scripts/README.md @@ -0,0 +1,69 @@ +# Pika Agent 升级脚本 + +## RestartSec 配置升级脚本 + +### 背景 + +旧版本的 pika-agent 使用 `kardianos/service` 库的默认模板,导致 systemd 服务的 `RestartSec` 被硬编码为 120 秒。新版本通过自定义模板将其改为 5 秒,以实现更快的故障恢复。 + +### 一键升级 + +**推荐方式:直接通过 curl 执行** + +```bash +curl -fsSL https://raw.githubusercontent.com/dushixiang/pika/main/scripts/update-restartsec.sh | sudo bash +``` + +### 脚本功能 + +1. ✓ 检查是否以 root 权限运行 +2. ✓ 检查服务文件是否存在 +3. ✓ 检查当前 RestartSec 配置(如果已经是 5 秒则跳过) +4. ✓ 修改 RestartSec 为 5 秒 +5. ✓ 重新加载 systemd 配置 +6. ✓ 自动重启服务并验证状态 + +### 验证结果 + +```bash +# 查看服务文件中的 RestartSec 配置 +cat /etc/systemd/system/pika-agent.service | grep RestartSec + +# 应该显示: RestartSec=5 +``` + +### 注意事项 + +- **脚本会自动重启服务以应用新配置** +- 重启过程通常只需 2-3 秒,对监控数据影响极小 +- 脚本会自动检测服务重启后的状态,确保服务正常运行 + +### 批量升级多台服务器 + +如果有多台服务器需要升级: + +```bash +#!/bin/bash + +SERVERS=( + "192.168.1.10" + "192.168.1.11" + "192.168.1.12" +) + +for server in "${SERVERS[@]}"; do + echo "================================" + echo "升级服务器: $server" + echo "================================" + ssh root@$server 'curl -fsSL https://raw.githubusercontent.com/dushixiang/pika/main/scripts/update-restartsec.sh | bash' + echo "" +done + +echo "所有服务器升级完成!" +``` + +### 新版本安装 + +对于新安装的服务(使用新版本代码重新编译),无需运行此脚本,因为新版本会自动使用正确的配置。 + +**此脚本仅用于升级已安装的旧版本服务。** diff --git a/scripts/update-restartsec.sh b/scripts/update-restartsec.sh new file mode 100755 index 0000000..2e2211d --- /dev/null +++ b/scripts/update-restartsec.sh @@ -0,0 +1,115 @@ +#!/bin/bash + +# Pika Agent RestartSec 升级脚本 +# 用途: 将 systemd 服务的 RestartSec 从 120 改为 5 +# 使用: curl -fsSL https://raw.githubusercontent.com/dushixiang/pika/main/scripts/update-restartsec.sh | sudo bash + +set -e + +# 颜色输出 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +SERVICE_NAME="pika-agent" +SERVICE_FILE="/etc/systemd/system/${SERVICE_NAME}.service" + +echo "================================================" +echo "Pika Agent RestartSec 升级脚本" +echo "================================================" +echo "" + +# 检查是否以 root 权限运行 +if [ "$EUID" -ne 0 ]; then + echo -e "${RED}错误: 请使用 root 权限运行此脚本${NC}" + echo "使用方法: curl -fsSL https://raw.githubusercontent.com/dushixiang/pika/main/scripts/update-restartsec.sh | sudo bash" + exit 1 +fi + +# 检查服务文件是否存在 +if [ ! -f "$SERVICE_FILE" ]; then + echo -e "${RED}错误: 服务文件不存在: $SERVICE_FILE${NC}" + echo "请先安装 pika-agent 服务" + exit 1 +fi + +echo -e "${YELLOW}[1/3] 检查当前配置...${NC}" +# 检查当前的 RestartSec 值 +CURRENT_RESTART_SEC=$(grep -oP '^\s*RestartSec=\K\d+' "$SERVICE_FILE" || echo "") + +if [ -z "$CURRENT_RESTART_SEC" ]; then + echo -e "${YELLOW}警告: 未找到 RestartSec 配置${NC}" +else + echo "当前 RestartSec = $CURRENT_RESTART_SEC 秒" +fi + +# 如果已经是 5,则无需修改 +if [ "$CURRENT_RESTART_SEC" = "5" ]; then + echo -e "${GREEN}✓ RestartSec 已经是 5 秒,无需修改${NC}" + exit 0 +fi + +echo "" +echo -e "${YELLOW}[2/3] 修改 RestartSec 配置...${NC}" +# 修改 RestartSec 为 5 +if grep -q "^\s*RestartSec=" "$SERVICE_FILE"; then + # 如果存在 RestartSec,则替换 + sed -i 's/^\(\s*\)RestartSec=.*/\1RestartSec=5/' "$SERVICE_FILE" + echo "已将 RestartSec 修改为 5 秒" +else + # 如果不存在 RestartSec,则在 Restart=always 后添加 + sed -i '/^\s*Restart=always/a RestartSec=5' "$SERVICE_FILE" + echo "已添加 RestartSec=5 配置" +fi + +echo "" +echo -e "${YELLOW}[3/4] 重新加载 systemd 配置...${NC}" +# 重新加载 systemd 配置 +systemctl daemon-reload +echo "systemd 配置已重新加载" + +# 验证修改后的值 +NEW_RESTART_SEC=$(grep -oP '^\s*RestartSec=\K\d+' "$SERVICE_FILE") + +if [ "$NEW_RESTART_SEC" != "5" ]; then + echo "" + echo "================================================" + echo -e "${RED}✗ 配置修改失败${NC}" + echo "================================================" + echo "" + echo "当前 RestartSec = $NEW_RESTART_SEC 秒" + echo "请检查服务文件: cat $SERVICE_FILE" + exit 1 +fi + +echo "" +echo -e "${YELLOW}[4/4] 重启服务以应用新配置...${NC}" +# 重启服务 +if systemctl restart $SERVICE_NAME; then + echo "服务已重启" + + # 等待一下,确保服务启动 + sleep 2 + + # 检查服务状态 + if systemctl is-active --quiet $SERVICE_NAME; then + echo -e "${GREEN}✓ 服务运行正常${NC}" + else + echo -e "${YELLOW}警告: 服务可能未正常启动,请检查状态${NC}" + echo "执行: systemctl status $SERVICE_NAME" + fi +else + echo -e "${RED}✗ 服务重启失败${NC}" + echo "请手动检查: systemctl status $SERVICE_NAME" + exit 1 +fi + +echo "" +echo "================================================" +echo -e "${GREEN}✓ 升级完成!${NC}" +echo "================================================" +echo "" +echo "修改后 RestartSec = $NEW_RESTART_SEC 秒" +echo "服务已自动重启并应用新配置" +echo ""