diff --git a/start-systemd.sh b/start-systemd.sh index bf63d6f..ba44754 100644 --- a/start-systemd.sh +++ b/start-systemd.sh @@ -15,11 +15,38 @@ cd "$SCRIPT_DIR" BINARY_NAME="agent" BACKEND_URL="${BACKEND_URL:-http://localhost:8080}" +# 检查二进制文件是否存在且有效 +check_binary() { + if [ -f "$BINARY_NAME" ] && [ -x "$BINARY_NAME" ] && [ -s "$BINARY_NAME" ]; then + # 验证二进制文件类型(Linux 应该是 ELF 文件) + if command -v file > /dev/null 2>&1; then + local file_type=$(file "$BINARY_NAME" 2>/dev/null || echo "") + if [ -n "$file_type" ] && echo "$file_type" | grep -qi "ELF"; then + return 0 + fi + else + # 如果没有 file 命令,至少检查文件大小(应该大于 1MB) + local file_size=$(stat -c%s "$BINARY_NAME" 2>/dev/null || stat -f%z "$BINARY_NAME" 2>/dev/null || echo "0") + if [ "$file_size" -gt 1048576 ]; then + return 0 + fi + fi + fi + return 1 +} + # 拉取最新源码并编译 update_and_build() { + # 如果二进制文件已存在且有效,跳过编译 + if check_binary; then + echo "二进制文件已存在,跳过编译步骤" + return 0 + fi + # 检查是否在 Git 仓库中 if [ ! -d ".git" ]; then - return 0 + echo "错误: 不在 Git 仓库中,无法更新代码" >&2 + return 1 fi # 配置 Git safe.directory,解决所有权问题 @@ -44,8 +71,28 @@ update_and_build() { exit 1 fi - # 更新依赖 - go mod download 2>&1 > /dev/null || true + # 检查是否有 vendor 目录 + local use_vendor=false + if [ -d "./vendor" ] && [ -f "./vendor/modules.txt" ]; then + use_vendor=true + echo "使用 vendor 目录编译(无需网络连接)" + fi + + # 更新依赖(仅在非 vendor 模式下,并设置超时避免卡住) + if [ "$use_vendor" != "true" ]; then + echo "更新 Go 依赖..." + # 使用 timeout 命令设置超时(30秒),如果系统没有 timeout 命令则直接执行 + if command -v timeout > /dev/null 2>&1; then + timeout 30 go mod download 2>&1 > /dev/null || { + echo "警告: 依赖更新失败或超时,尝试继续编译" >&2 + } + else + # 如果没有 timeout 命令,直接执行(可能卡住,但至少能工作) + go mod download 2>&1 > /dev/null || { + echo "警告: 依赖更新失败,尝试继续编译" >&2 + } + fi + fi # 编译 ARCH=$(uname -m) @@ -61,21 +108,33 @@ update_and_build() { ;; esac - if GOOS=linux GOARCH=${ARCH} CGO_ENABLED=0 go build -buildvcs=false -ldflags="-w -s" -o "$BINARY_NAME" ./cmd/agent 2>&1; then + # 构建编译命令 + local build_cmd="GOOS=linux GOARCH=${ARCH} CGO_ENABLED=0 go build -buildvcs=false -ldflags=\"-w -s\"" + if [ "$use_vendor" = "true" ]; then + build_cmd="$build_cmd -mod=vendor" + fi + build_cmd="$build_cmd -o \"$BINARY_NAME\" ./cmd/agent" + + echo "开始编译(架构: ${ARCH})..." + if eval "$build_cmd" 2>&1; then if [ -f "$BINARY_NAME" ] && [ -s "$BINARY_NAME" ]; then chmod +x "$BINARY_NAME" + echo "编译成功" + return 0 else echo "错误: 编译失败,未生成二进制文件" >&2 - exit 1 + return 1 fi else echo "错误: 编译失败" >&2 - exit 1 + return 1 fi } -# 拉取最新源码并编译 -update_and_build +# 检查并更新/编译 +if ! check_binary; then + update_and_build +fi # 设置环境变量 export BACKEND_URL="$BACKEND_URL"