Ubuntu 18系统下Crontab执行gcloud关闭GCP VM实例失败求助
问题解决步骤
1. 修复脚本基础语法与兼容性问题
原脚本中source/etc/profile缺少空格属于语法错误,首先修正为source /etc/profile。
同时为避免环境变量加载异常,建议在脚本中补全gcloud命令的绝对路径,可先执行which gcloud获取gcloud的实际路径(例如返回/usr/bin/gcloud),修改后的完整脚本参考:
#!/bin/bash # 开启调试模式,方便后续排查问题 set -x source /etc/profile # 替换为你实际查到的gcloud绝对路径 echo Y | /usr/bin/gcloud compute instances stop my-vm-name --zone us-central1-a sleep 120s echo "completed"
2. 修正Crontab配置
crontab默认执行环境的变量、shell规则和用户手动执行的环境差异很大,按以下规则调整:
- 确认crontab所属用户和你手动执行脚本的用户一致:如果手动执行时用的是普通用户,就用
crontab -e编辑当前用户的定时任务,不要使用sudo操作root的crontab,否则root用户没有对应的gcloud认证配置。 - 匹配脚本的解释器,同时补全错误日志输出:你脚本声明的是bash解释器,不要用sh调用,同时添加
2>&1把错误输出也重定向到日志中,方便排查问题,调整后的定时规则如下:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 20 17 * * * /bin/bash /home/user/Desktop/script.sh >>/home/user/cron.log 2>&1
开头额外添加的PATH配置可以避免crontab默认环境找不到命令的问题。
3. 补充gcloud认证配置
gcloud的认证凭证默认存储在当前用户的~/.config/gcloud/目录下,如果仍执行失败,可以在脚本中显式声明认证配置:
- 如果你用的是服务账号密钥,在脚本
source /etc/profile行后添加:
export GOOGLE_APPLICATION_CREDENTIALS="替换为你的服务账号密钥json文件绝对路径"
4. 验证测试
修改完成后可以先把定时任务改成每分钟执行一次测试:
* * * * * /bin/bash /home/user/Desktop/script.sh >>/home/user/cron.log 2>&1
等待1分钟后查看/home/user/cron.log的内容,根据日志中的报错信息做对应调整即可。
内容的提问来源于stack exchange,提问作者Anonyme
相关产品推荐
相关产品推荐

