【问题标题】:Python Script not working as expected when run by Crontab由 Crontab 运行时,Python 脚本无法按预期工作
【发布时间】: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


【解决方案1】:

如上述更新中所述,问题出在代理上。 pyton 在手动执行时已知的全局设置在从 crontab 启动时是未知的。这个问题的解决方法是在crontab文件中添加proxy config:

HTTP_PROXY=http://proxyip:proxyport
HTTPS_PROXY=http://proxyip:proxyport
0 3 * * * python3 /home/pi/path/to/script.py >> /home/pi/logfile.txt 2>&1

但是:这似乎只适用于直接称为表单 crontab 的文件。在我的情况下,我从 python 文件中调用另一个 bash 脚本,该脚本也无法解析地址。为此,另一个调用:

export http_proxy="http://proxyip:proxyport"
export https_proxy="http://proxyip:proxyport"

执行前需要!

感谢 farbiondrive 提供解决方案的提示!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-06
    • 2015-06-26
    • 2010-11-30
    • 2016-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多