GCP Terraform metadata启动脚本已存在flag文件仍重复运行问题
GCP启动脚本重复执行问题排查与解决方案
核心问题定位
你的启动脚本重复执行的根本原因是**/var/run是临时文件系统(tmpfs)**,系统重启后该目录下的所有文件会被清空,导致每次重启时flag.txt都不存在,脚本自然会重新执行。
排查与修复步骤
1. 迁移flag文件到持久化目录
将flag文件从/var/run移动到不会随重启清空的目录,比如/var/lib或/etc:
- 修改启动脚本中的检查路径:
if [ ! -f /var/lib/setup_completed.flag ]; - 修改Python脚本中的写入路径:
with open("/var/lib/setup_completed.flag", "w") as file: file.write("This file was created at: " + formatted_datetime)
2. 修复Python脚本语法错误
你的date_flag.py存在两处语法问题,会导致脚本执行失败(需确认实际运行版本是否已修正):
- 变量名错误:
formatted_date未定义,应为formatted_datetime - 语句未闭合:
write方法末尾缺少右括号
修正后的完整Python脚本:
import datetime current_datetime = datetime.datetime.now() formatted_datetime = current_datetime.strftime("%Y-%m-%d_%H-%M-%S") # 原代码中file_name变量未使用,可删除 with open("/var/lib/setup_completed.flag", "w") as file: file.write("This file was created at: " + formatted_datetime)
3. 简化启动脚本的权限逻辑
GCP虚拟机的启动脚本默认以root用户执行,无需添加sudo前缀,避免不必要的权限问题:
#!/bin/bash if [ ! -f /var/lib/setup_completed.flag ]; then apt-get update apt-get install -y gcloud echo '${local.script_content}' > /tmp/install_docker.sh echo '${local.flag_content}' > /tmp/date_flag.py chmod +x /tmp/install_docker.sh /tmp/date_flag.py bash /tmp/install_docker.sh /usr/bin/python3 /tmp/date_flag.py else exit 0 fi
4. 验证脚本执行状态
- 查看启动脚本日志:
journalctl -u google-startup-scripts.service,确认脚本是否因文件不存在而重复执行 - 手动创建flag文件后重启虚拟机,检查脚本是否不再执行:
touch /var/lib/setup_completed.flag reboot
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

