crontab执行GDrive上传脚本失败提示Token过期/吊销,root执行正常
我编写了一个将图片上传/更新至GDrive的脚本,计划通过crontab每15分钟执行一次。以root身份(sudo -s)测试脚本时,可正常访问GDrive并完成上传;但通过crontab条目执行时失败,报错信息如下:
Uploading upload.jpg Failed to upload file: Patch https://www.googleapis.com/upload/drive/v3/files/1y0000hMVV444qjuxC5xqL3hsmyAuoXya?alt=json&fields=id%2Cname%2Csize&uploadType=multipart: oauth2: cannot fetch token: 400 Bad Request Response: { "error": "invalid_grant", "error_description": "Token has been expired or revoked." }
我的crontab条目如下:
*/15 * * * * root /srv/media/webcam/nordbahnstrasse/scripts/upload_image.sh >> /var/log/upload_image.txt
指定OAuth2令牌文件的绝对路径
手动执行时root的环境变量能定位到令牌文件,但crontab的执行环境没有完整的用户目录变量。务必在脚本里写死令牌文件的绝对路径(比如/root/.config/gdrive/token.json),不要用相对路径。同时确保该文件权限为root可读:chmod 600 /root/.config/gdrive/token.json。让crontab加载完整的root环境
Crontab的执行环境比手动登录精简很多,可能缺少GDrive工具依赖的环境变量。修改crontab条目,用登录shell启动脚本:*/15 * * * * root bash -l -c "/srv/media/webcam/nordbahnstrasse/scripts/upload_image.sh >> /var/log/upload_image.txt"-l参数会让bash加载/root/.bashrc或/root/.profile里的环境变量,确保GDrive工具能正常找到依赖。重新生成OAuth2令牌
手动执行时的令牌可能和crontab环境不兼容,或者确实已过期。以root身份重新执行授权流程:运行脚本里的GDrive授权命令(比如gdrive auth,根据你用的工具调整),完成授权后确保新令牌的路径被脚本正确引用。检查crontab时区设置
若crontab时区与系统时区不一致,可能导致任务执行时机异常,间接引发令牌问题。可以在crontab顶部添加时区配置(比如TZ=Europe/Berlin,根据你的地区调整),或确认系统时区设置正确。
内容的提问来源于stack exchange,提问作者Max

