【问题标题】:Python script not getting executed when put on crontab放在 crontab 上时没有执行 Python 脚本
【发布时间】:2016-08-19 08:54:22
【问题描述】:

我编写了一个 python 脚本,它正在读取一些日志,然后将所需的信息写入 csv 文件。如果我通过 python myscript.py 手动执行它,它工作正常。但是当我通过 cron 调用它时它不起作用. 我试过了:

* * * * * python /path/to/myscript.py
* * * * * /path/to/myscript.py
* * * * * /usr/bin/python /path/to/myscript.py

在一些失败的尝试之后,我将 python myscript.py 放入一个 shell 脚本并手动运行它,它可以工作,但在 cron 中它再次没有。

【问题讨论】:

  • 我写了一个python脚本你的相关代码在哪里?
  • python 脚本中的任何内容都不相关。问题是cron的默认shell不是/bin/bash
  • 抱歉,我的水晶球要维修了。但也许您可以从记录错误或脚本输出的任何内容开始,这样您就可以知道发生了什么?
  • /var/log/syslog?中是否有相应的错误提示
  • @j4ck 不同之处在于bash 为用户设置环境并将目录更改为$HOME,而在cron 中默认sh 没有。

标签: python shell cron-task


【解决方案1】:

cron 的默认 shell 不是 /bin/bash,因此您需要提供 Python 可执行文件的完整路径。
检查which python 的输出。在我的机器上是/usr/bin/python
假设这一点,您的 cron 作业条目应该是:

* * * * * /usr/bin/python /path/to/myscript.py

有时您想在运行脚本之前使用 virtualenv 或设置一些环境变量或更改工作目录。
在这种情况下,在 bash 中创建一个包装脚本会很方便:

#!/bin/bash
# Change working directory
cd /path/to
# Activate Python virtual environment
source bin/activate
# Set some environment variable
export LOG_FILE_PATH="/var/log/whatever.log"
# Finally run your python script
python myscript.py

鉴于您将上述脚本保存到 /path/to/myscript_wrapper.sh,您的 cron 作业条目将如下所示:

* * * * * /bin/bash /path/to/myscript_wrapper.sh

【讨论】:

  • 也是第二种解决方案?
  • ..如果你已经尝试过了,你应该有一个日志消息,不是吗?这说明了什么?
  • 还没有尝试第二种方法。我不完全明白。
  • 再来一次。 Cront 使用的是/bin/sh 而不是/bin/bash。使用 /bin/sh 您的默认环境,例如.bashrc 未加载,工作目录也未更改为您的 $HOME。这总是会导致您遇到头痛。只需编写我向您展示的 bash 脚本。如果您不使用 virtualenv 和 env vars,请删除行 source bin/activateexport LOG_FILE_PATH="/var/log/whatever.log",并从 cron 而不是直接从 python 脚本启动此包装脚本。
  • * * * * * root(username) /path/to/myscript_wrapper.sh 会有帮助吗??
【解决方案2】:

确保不要在 Python 脚本中使用任何类型的相对路径。这可能会导致您的脚本退出并出现错误。

所以请确保在您的脚本中不要使用../to/something,而是使用/path/to/something

with open('../file.txt', 'r') as f:

应该变成

with open('/full/path/to/file.txt', 'r') as f:

【讨论】:

  • 是的,我只使用绝对路径。
  • 在 Python 脚本中硬编码绝对路径并不是一个好主意。想象一下,您将其部署到生产服务器,您将立即看到类似No such file or directory: /home/j4ck/... 的错误,因为通常您不会代表您的 unix 用户在生产环境中运行服务,因此您的所有服务代码和相关文件将落在其他目录而不是你的主目录。
  • 没错,如果是这样的话,我仍然不推荐.. - 而是像os.abspath(__file__) 这样的东西,而是从那里开始工作。但我可能只是被我过去在这个和 cron 工作中遇到的麻烦所打上烙印,而且我在部署到外国系统方面没有太多经验。
  • 现在你在说话。你是 100% 正确的 - os.abspath(__file__) 是基本设置的方式。但是,如果使用部署自动化工具,那么这些工具负责传递正确的命令行参数、环境变量或配置文件,以便实际服务获取有关路径、远程服务等的所有信息。
【解决方案3】:
  • 输入“which python”(如果您使用的是python3或python3.6,则需要使用which python3
  • 它将显示python路径:/bin/python。
  • 在 Cron 作业中设置值 - * * * * * /bin/python

如果你想在 cronjob 的帮助下在 bash 脚本中执行 python 文件。您应该在 bash 脚本中使用 python 的完整路径(示例:/bin/python /python 文件/file.py 的路径)。

【讨论】:

    猜你喜欢
    • 2021-04-07
    • 2016-07-19
    • 2013-08-28
    • 2020-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    • 2012-10-26
    相关资源
    最近更新 更多