You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google Cloud Compute VM启动脚本中断未完成,请求排查原因

GCE自删除VM启动脚本执行异常排查

问题描述

通过Python调用gcloud compute instances create-with-container创建GCE VM,附带的启动脚本计划在60秒后自动删除实例,但GCE日志中仅能看到Start the startup script,后续步骤无输出,脚本未完成自删除操作。

启动脚本内容:

#!/bin/bash
echo Start the startup script
sleep 60s
echo BEFORE Deleting the VMs after max running time
export NAME="$(curl -X GET http://metadata.google.internal/computeMetadata/v1/instance/name -H 'Metadata-Flavor: Google')"
export ZONE="$(curl -X GET http://metadata.google.internal/computeMetadata/v1/instance/zone -H 'Metadata-Flavor: Google')"
echo AFTER Deleting the VMs after max running time
gcloud --quiet compute instances delete $NAME --zone=$ZONE

Python调用命令:

cmd = """gcloud compute instances create-with-container \
    {0} \
    --project={1} \
    --zone=us-central1-c \
    --container-image=gcr.io/project/image \
    --machine-type={2} \
    --scopes "bigquery","gke-default","storage-full","compute-rw" \
    --boot-disk-size {3} \
    --boot-disk-type "pd-ssd" \
    --container-env YAML={4},DATE={5},BUCKET={6} \
    --service-account "{7}" \
    --metadata-from-file=startup-script=startup.sh \
    --description="{8}"
    """.format(vm,
               gcp,
               machine,
               disk_size,
               yamlup,
               self.partition,
               bucket_name,
               serviceaccount,
               description
               )

排查方向

  • 日志查看范围错误:启动脚本运行在VM的主机操作系统中,而非容器内部。若仅查看容器日志,会遗漏启动脚本的后续输出。需在GCP控制台实例详情的「日志」标签中,切换查看「启动脚本日志」或「串行端口1输出」。

  • sleep命令兼容性问题:部分简化版系统(如基于BusyBox的镜像)的sleep命令不支持s后缀,将sleep 60s改为sleep 60重试。

  • 服务账号权限不足:启动脚本中gcloud compute instances delete需要服务账号拥有compute.instances.delete权限。检查指定的服务账号是否已分配「Compute Instance Admin (v1)」角色或包含该权限的自定义角色。

  • curl命令失败无反馈:获取元数据的curl命令可能因网络或权限问题失败,且未输出错误信息。修改curl命令添加错误处理:

    export NAME="$(curl -f -X GET http://metadata.google.internal/computeMetadata/v1/instance/name -H 'Metadata-Flavor: Google')"
    if [ -z "$NAME" ]; then
        echo "Failed to retrieve instance name from metadata server"
        exit 1
    fi
    export ZONE="$(curl -f -X GET http://metadata.google.internal/computeMetadata/v1/instance/zone -H 'Metadata-Flavor: Google')"
    if [ -z "$ZONE" ]; then
        echo "Failed to retrieve instance zone from metadata server"
        exit 1
    fi
    
  • gcloud命令路径问题:主机系统中gcloud可能不在默认PATH中,改用绝对路径执行命令,例如:

    /usr/bin/gcloud --quiet compute instances delete $NAME --zone=$ZONE
    
  • 脚本执行权限问题:确保startup.sh文件拥有可执行权限(chmod +x startup.sh),再通过--metadata-from-file上传。

内容的提问来源于stack exchange,提问作者PavlMits

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 09:31:33