You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

排查方向与解决方法

  1. 修复日志输出顺序
    原Cron命令中2>&1 >/home/ec2-user/log.txt的顺序错误,会导致错误信息无法写入日志。正确写法应为:
* * * * * /usr/bin/python3 /home/ec2-user/scripts/test.py >> /home/ec2-user/log.txt 2>&1

这样标准输出和错误输出都会追加到日志,方便定位具体报错。

  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
  1. 修正权限问题
    从日志看Cron是以root身份执行的,可能存在两类权限问题:
  • 脚本权限:执行sudo chmod +x /home/ec2-user/scripts/test.py,确保root有脚本执行权限。
  • S3访问权限:root用户可能没有访问目标S3桶的权限,而终端用ec2-user执行时有权限。可以改为用ec2-user身份执行Cron:
    1. 执行crontab -e编辑ec2-user的Cron表
    2. 添加命令:* * * * * /usr/bin/python3 /home/ec2-user/scripts/test.py >> /home/ec2-user/log.txt 2>&1

内容的提问来源于stack exchange,提问作者KalebK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 15:18:14