如何解决crontab执行脚本删除S3存储桶对象不生效的问题
问题原因及对应解决方法
- crond服务未启动
你执行ps aux | grep crond的输出仅包含grep自身进程,说明系统的定时任务服务没有运行,配置的cron规则自然不会被触发。
解决方法:执行以下命令启动crond服务并设置开机自启:
sudo systemctl start crond sudo systemctl enable crond
- 执行用户的AWS凭证缺失
你通过sudo crontab -e配置的定时任务是以root用户身份执行,而你手动运行脚本时用的是ec2-user用户。你代码中boto3.Session()用的是默认凭证链,正常运行时的凭证大概率存储在ec2-user的~/.aws/credentials文件中,root用户没有对应的AWS访问凭证,就算crond正常运行也会出现鉴权失败。
解决方法:可以把定时任务配置在ec2-user的crontab中(直接执行crontab -e不要加sudo),或者为root用户配置对应的AWS访问凭证。 - 脚本内路径不匹配
你的job.sh中写的是python s3delete.py,cron执行定时任务时默认工作目录不是/home/ec2-user,会找不到s3delete.py文件导致执行失败。同时cron的PATH环境变量和用户登录态的PATH不同,也可能出现找不到python命令的问题。
解决方法:修改job.sh补充绝对路径,参考如下:
#!/bin/bash cd /home/ec2-user /usr/bin/python s3delete.py
注:可执行which python获取你环境中python的实际绝对路径替换上面的示例路径
- 日志配置不全导致看不到报错
你原来的日志重定向规则只捕获了标准输出,错误输出没有被重定向,所以脚本执行报错时日志文件也会是空的。修改cron规则把错误输出也重定向即可排查后续问题:
*/1 * * * * /home/ec2-user/job.sh > /tmp/s3delete.log 2>&1
内容的提问来源于stack exchange,提问作者Some Java Guy
相关产品推荐
相关产品推荐

