Python脚本Shell执行遇HTTP 404错误,命令行运行正常
问题:Cron执行Shell脚本调用Python时触发HTTP 404错误,手动运行正常
背景
需要通过cronjob每小时执行Shell脚本,调用Python脚本提取数据库每日新增数据。但Shell脚本通过Cron运行时出现HTTP 404错误,直接用Python命令行运行该脚本却能正常获取数据。已确认两种运行方式使用的Python版本一致,且排除了“当前日期未结束导致查找未发生时段数据”的可能。
错误日志
for i in '${madis_sources}' ++ python /Users/estrobach/Python_Scripts/Urban_Evaluations/madisData.py acarsProfiles *2024-07-18 2024-07-19 -80 -74 37 43 False 2024-07-18 00:00:00 /Users/estrobach/Data/acarsProfiles/ point acarsProfiles False* Traceback (most recent call last): File "/Users/estrobach/Python_Scripts/Urban_Evaluations/madisData.py", line 25, in <module> dat=madisImport(Date,database,Type,source,archive) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "<string>", line 21, in madisImport File "/opt/anaconda3/lib/python3.11/urllib/request.py", line 241, in urlretrieve with contextlib.closing(urlopen(url, data)) as fp: ^^^^^^^^^^^^^^^^^^ File "/opt/anaconda3/lib/python3.11/urllib/request.py", line 216, in urlopen return opener.open(url, data, timeout) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/anaconda3/lib/python3.11/urllib/request.py", line 525, in open response = meth(req, response) ^^^^^^^^^^^^^^^^^^^ File "/opt/anaconda3/lib/python3.11/urllib/request.py", line 634, in http_response response = self.parent.error( ^^^^^^^^^^^^^^^^^^ File "/opt/anaconda3/lib/python3.11/urllib/request.py", line 563, in error return self._call_chain(*args) ^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/anaconda3/lib/python3.11/urllib/request.py", line 496, in _call_chain result = func(*args) ^^^^^^^^^^^ File "/opt/anaconda3/lib/python3.11/urllib/request.py", line 643, in http_error_default raise HTTPError(req.full_url, code, msg, hdrs, fp) urllib.error.HTTPError: HTTP Error 404: Not Found
错误定位
错误触发于madisData.py第25行的dat=madisImport(Date,database,Type,source,archive)调用,对应madisImport.py第21行的urllib.request.urlretrieve(f, DataDump + fname)代码,是目标URL返回404未找到。
排查方向
- 环境变量差异:Cron运行环境和用户登录环境的环境变量可能不同,在Shell脚本开头添加
printenv输出所有环境变量,对比手动运行时的环境,检查脚本依赖的变量(如数据源配置、路径变量)是否在Cron环境中正确设置。 - 路径一致性:脚本中若使用相对路径,Cron的工作目录可能与手动运行时不同,导致路径解析错误。统一使用绝对路径(包括Python脚本路径、数据存储路径等),避免工作目录差异带来的问题。
- URL生成校验:在
urllib.request.urlretrieve之前添加日志,打印实际请求的URLf,对比手动运行和Cron运行时生成的URL是否完全一致。有可能是Cron环境下日期/时间变量的格式或取值异常,导致生成了不存在的资源URL。 - 网络权限检查:部分系统中Cron的网络访问权限受限制,检查防火墙、代理设置是否与用户登录环境一致,确认Cron环境能否正常访问目标数据源地址。
内容的提问来源于stack exchange,提问作者user23826167
相关产品推荐
相关产品推荐

