Google Cloud Compute 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 figcloud命令路径问题:主机系统中gcloud可能不在默认PATH中,改用绝对路径执行命令,例如:
/usr/bin/gcloud --quiet compute instances delete $NAME --zone=$ZONE脚本执行权限问题:确保
startup.sh文件拥有可执行权限(chmod +x startup.sh),再通过--metadata-from-file上传。
内容的提问来源于stack exchange,提问作者PavlMits

