【发布时间】:2021-11-03 10:28:15
【问题描述】:
我必须运行一个特定的 python 脚本,它每晚 3 点通过 REST API 请求一些数据。 为此,我启用了 crontab:
0 3 * * * python3 /home/pi/path/to/script.py >> /home/pi/logfile.txt 2>&1
当我自己执行脚本时,一切都按预期工作,但是当 cron 启动脚本时,我收到名称服务器无法解析我的请求的错误:
File "/usr/lib/python3/dist-packages/urllib3/connection.py", line 159, in _new_conn
(self._dns_host, self.port), self.timeout, **extra_kw)
File "/usr/lib/python3/dist-packages/urllib3/util/connection.py", line 57, in create_connection
for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM):
File "/usr/lib/python3.7/socket.py", line 748, in getaddrinfo
for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
socket.gaierror: [Errno -3] Temporary failure in name resolution
我已验证该脚本是由同一用户 (pi) 执行的。
我在公司代理后面,但到目前为止,手动启动它时我没有遇到任何问题。有人可以指出执行的不同之处吗?我想它必须是一样的。
- 硬件:Pi4 4GB
- 操作系统:Linux raspi 5.10.11-v7l+ #1399 SMP Thu Jan 28 12:09:48 GMT 2021 armv7l GNU/Linux
- 软件:
- Linux 上的 Python 3.7.3(默认,2020 年 7 月 25 日,13:03:44)[GCC 8.3.0]
- 请求==2.21.0
更新:
我发现问题是使用 crontab 启动我的脚本时全局代理设置未激活。
当我从设置代理的 cron 调用 bash 脚本而不是调用脚本时,我可以让它工作:
#!/bin/bash
export http_proxy="http://proxyip:proxyport"
export https_proxy="http://proxyip:proxyport"
python3 /home/pi/path/to/script.py >> /home/pi/logfile.txt 2>&1
【问题讨论】:
-
你能添加一个日志行来显示脚本试图调用的主机吗?
-
主机信息从何而来?它是硬编码的还是从文件中获取的?
-
requests 抱怨它无法到达主机地址,但异常并没有显示它的样子。有一个日志行显示这将有助于调试,因此您可以确认它是否是权限问题。
-
你能不能试着把它包装在一个脚本中,先运行 /etc/profile.d/proxy.sh 然后你的 python 代码?
-
有同样的想法,这工作正常
标签: python python-3.x rest cron