GCP Terraform VM启动脚本中sed命令报错:无此文件或目录
解决启动脚本中sed命令报错的问题
核心问题分析
报错sed: can't read : No such file or directory本质是执行sed时目标文件/pd-disk/config.toml还不存在或无法访问。手动执行正常是因为此时磁盘已挂载、文件已下载完成,但启动脚本的执行时机更早,大概率遇到以下两种情况:
- 附加磁盘
/pd-disk尚未完成挂载 - 下载
config.toml的步骤未执行完成或失败
具体修复步骤
1. 确保磁盘挂载完成后再执行操作
在启动脚本开头添加磁盘挂载等待逻辑,避免脚本提前执行:
# 等待/pd-disk挂载完成 until mountpoint -q /pd-disk; do echo "等待附加磁盘/pd-disk挂载..." >> /var/log/startup-debug.log sleep 5 done
2. 验证文件存在后再执行sed
在sed命令前添加文件存在检查,同时确保下载步骤执行成功:
# 等待config.toml文件下载完成(替换为你的实际下载命令,比如wget/curl) until [ -f /pd-disk/config.toml ]; do echo "等待config.toml文件下载完成..." >> /var/log/startup-debug.log # 这里添加你的下载命令示例 curl -o /pd-disk/config.toml https://your-config-url/config.toml sleep 3 done # 修复不必要的递归权限修改(单个文件无需-R,且避免过度开放权限) chmod 644 /pd-disk/config.toml # 执行sed替换 sed -i 's/http:\/\/localhost:8545/http:\/\/bor:8545/g' /pd-disk/config.toml
3. 修复Terraform内联脚本的转义问题
如果你的Terraform启动脚本是用双引号包裹的内联字符串,容易出现特殊字符转义错误,建议改用heredoc格式定义脚本,避免转义麻烦:
resource "google_compute_instance" "vm_instance" { # 其他VM配置... metadata = { startup-script = <<-EOF #!/bin/bash # 等待磁盘挂载 until mountpoint -q /pd-disk; do echo "等待磁盘挂载..." >> /var/log/startup-debug.log sleep 5 done # 下载config.toml(替换为你的实际下载地址) curl -o /pd-disk/config.toml https://example.com/config.toml # 等待文件存在 until [ -f /pd-disk/config.toml ]; do echo "等待文件下载..." >> /var/log/startup-debug.log sleep 3 done chmod 644 /pd-disk/config.toml sed -i 's/http:\/\/localhost:8545/http:\/\/bor:8545/g' /pd-disk/config.toml EOF } }
调试建议
在启动脚本中添加更多日志输出,方便排查执行细节:
echo "启动脚本开始执行,当前时间:$(date)" >> /var/log/startup-debug.log echo "/pd-disk挂载状态:$(mountpoint -q /pd-disk && echo "已挂载" || echo "未挂载")" >> /var/log/startup-debug.log echo "config.toml存在状态:$(test -f /pd-disk/config.toml && echo "存在" || echo "不存在")" >> /var/log/startup-debug.log
执行完成后可通过cat /var/log/startup-debug.log查看详细过程。
内容的提问来源于stack exchange,提问作者Matt - Block-Farms.io
相关产品推荐
相关产品推荐

