AWS EC2 Linux实例中Crontab无法执行Python3脚本问题排查
AWS EC2 Linux实例中Cron无法运行Python3脚本的问题排查与解决
我在AWS EC2 Linux实例上无法通过Cron运行一个基础Python3脚本,但直接在bash终端执行脚本是正常的。
项目结构
ec2-user └─ log.txt └─ scripts └─ test.py
Python脚本内容
#!/usr/bin/python3 import pandas as pd import requests response = requests.get(url = 'https://api.coindesk.com/v1/bpi/currentprice.json') response = response.json() response = pd.DataFrame.from_dict(data = response['bpi']) response.to_csv('s3://my-bucket/test.csv')
Cron配置
* * * * * /usr/bin/python3 /home/ec2-user/scripts/test.py 2>&1 >/home/ec2-user/log.txt
Cron状态验证
执行sudo systemctl status crond后,确认Cron处于活跃状态:
Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled) Active: active (running) since Fri 2022-07-29 17:33:54 UTC; 23h ago Main PID: 3064 (crond) CGroup: /system.slice/crond.service └─3064 /usr/sbin/crond -n
已尝试的操作
- 修改Python脚本中shebang行的多种写法
- 将路径从相对路径改为绝对路径
- 验证python3的路径正确
编辑1:日志信息
查看/var/log/messages得到:
systemd: Created slice User Slice of root. systemd: Started Session 23 of user root. systemd: Removed slice User Slice of root.
查看/var/log/cron得到:
CROND[6260]: (root) CMD (/usr/bin/python3 /home/ec2-user/scripts/test.py 2>&1 >/home/ec2-user/log.txt)
排查方向与解决方法
- 修复日志输出顺序
原Cron命令中2>&1 >/home/ec2-user/log.txt的顺序错误,会导致错误信息无法写入日志。正确写法应为:
* * * * * /usr/bin/python3 /home/ec2-user/scripts/test.py >> /home/ec2-user/log.txt 2>&1
这样标准输出和错误输出都会追加到日志,方便定位具体报错。
- 解决环境变量差异
Cron的执行环境和终端用户的环境变量差异极大,尤其是Python依赖的路径。可以在Cron命令中加载用户环境变量:
* * * * * source /home/ec2-user/.bash_profile && /usr/bin/python3 /home/ec2-user/scripts/test.py >> /home/ec2-user/log.txt 2>&1
如果使用了虚拟环境,直接指定虚拟环境的Python路径:
* * * * * /home/ec2-user/venv/bin/python3 /home/ec2-user/scripts/test.py >> /home/ec2-user/log.txt 2>&1
- 修正权限问题
从日志看Cron是以root身份执行的,可能存在两类权限问题:
- 脚本权限:执行
sudo chmod +x /home/ec2-user/scripts/test.py,确保root有脚本执行权限。 - S3访问权限:root用户可能没有访问目标S3桶的权限,而终端用ec2-user执行时有权限。可以改为用ec2-user身份执行Cron:
- 执行
crontab -e编辑ec2-user的Cron表 - 添加命令:
* * * * * /usr/bin/python3 /home/ec2-user/scripts/test.py >> /home/ec2-user/log.txt 2>&1
- 执行
内容的提问来源于stack exchange,提问作者KalebK
相关产品推荐
相关产品推荐

