【问题标题】:Python Script not running in cronPython 脚本未在 cron 中运行
【发布时间】:2014-11-20 20:50:49
【问题描述】:

我正在尝试从 cron 运行 Python 脚本。我正在使用 crontab 以用户而不是 root 身份运行命令。我的 Python 脚本在顶部有 #! /usr/bin/env python 的 shebang,我做了 chmod +x 它以使脚本可执行。

该脚本在从 shell 运行时确实有效,但在使用 crontab 时无效。我确实检查了/var/log/cron 文件并看到脚本运行但绝对没有来自stdout 或stderr 的任何地方打印。

最后,我制作了一个打印日期和字符串的小脚本,并且每分钟都调用它,但这个其他脚本没有。我不知道为什么我会得到这些可变的结果......

这是我在crontab的条目

SHELL=/bin/bash



#min    #hour   day-of-month    month   day-of-week     command
#-------------------------------------------------------------------------
*/5     *       *                *        *             /path/to/script/script.py

这是我的脚本的源代码,它不会从 crontab 运行,但会在调用时从它所在的 shell 运行,如 ./script.py。顺便说一句,在我使用chmod +x 命令后,该脚本就可以执行了……:

#! /usr/bin/env python

#create a file and write to it
import time

def create_and_write():
    with open("py-write-out.out", "a+") as w:
        w.write("writing to file. hello from python. :D\n")
        w.write("the time is: " + str(time.asctime()) + "\n")
        w.write("--------------------------------\n")


def main():
    create_and_write()

if __name__ == "__main__":
    main()

编辑 我弄清楚出了什么问题。我需要将绝对文件路径放在脚本中,否则它会写入我没有计划的某个目录。

【问题讨论】:

  • 请附上相关代码——这将有助于我们回答。
  • shell 环境之间通常存在其他可能影响您的脚本的差异:不同的PYTHONPATH 是一种可能性。您可能希望在 cron 下运行一个脚本,该脚本仅打印其环境,并将其与基于 shell 手动执行的预期进行比较。
  • 你在重定向stdout和stderr吗?您希望看到它们出现在哪里?
  • 请发布您如何在 crontab 中创建条目。例如:5 5 * * * sript_to_run。所以它会帮助我们弄清楚,是cron条目还是代码的问题。大多数情况下,如何在 cron 中输入是一个问题。
  • 我看到你正在使用/usr/bin/env python。这假设 python 在$PATH 中。 python在哪里添加到路径中?如果在您的 .profile 中,那么您可能会发现它没有运行。使用/usr/bin/python 或任何你的python 路径更安全。

标签: python bash shell cron


【解决方案1】:

您可以按照以下步骤自行解决此问题:

  1. 修改cron为/path/to/script/script.py > /tmp/log 2> &1
  2. 现在,让 cron 运行
  3. 现在读取文件/tmp/log
  4. 您将找出您所面临问题的原因,以便您可以修复它。

根据我的经验,问题主要在于环境。
在 cron 中,未设置环境变量。因此,您可能必须在 cron 中为您的脚本显式设置 env。

【讨论】:

  • 我尽我所能尝试过,但没有成功。我在/tmp/log 中创建了文件,但那里没有写任何东西。另外,我认为使用&>> 是将stderr 和stdout 写入文件的更好选择。 ;)
  • 您的脚本是否在控制台上打印了一些内容?当您说日志文件为空时,我不敢相信。有两种情况:1. 在运行脚本时,shell 报告了一些错误。然后错误应该已经显示在文件中。 2. 你的脚本应该已经显示了一些东西,如果有的话。
  • 我做了一个类似的脚本,它只写入一个日志文件,但没有做我最初想要的。它应该调用另一个程序来运行,但它不这样做。它甚至不打印任何错误消息或任何东西...... 0_o
【解决方案2】:

好的,我想这个帖子仍然可以帮助 googlers。
我使用一种解决方法来运行带有 cron 作业的 python 脚本。事实上,python 脚本需要通过 cron 作业小心处理。
所以我让一个 bash 脚本来处理这一切。
我创建了一个 bash 脚本,它具有运行 python 脚本的命令。然后我安排一个 cron 作业来运行 bash 脚本。您甚至可以使用重定向器记录执行 python 脚本的 bash 命令的输出。
例如

@reboot /home/user/auto_delete.sh

auto_delete.sh 可能包含以下行:-

#!/bin/sh
echo $(date) >> bash_cron_log.txt
/usr/bin/python /home/user/auto_delete.py >> bash_cron_log.txt

所以我不需要担心 Cron Jobs 在 python 脚本上崩溃。

【讨论】:

  • 不错!这对我有用 - 我只需要确保我的所有路径名在 python 脚本和 bash 命令中都是明确的。
【解决方案3】:

另一个原因可能是我们判断执行或不执行的方式是错误的。

【讨论】:

    【解决方案4】:

    我想再强调一件事。我试图使用相同的技巧(使用 shell 脚本)在 cron 中运行 python 脚本,但这次它没有运行。这是@reboot cron。所以我在 crontab 中使用了重定向,正如我在上述 cmets 之一中提到的那样。并理解了问题所在。 我在 python 脚本中使用了很多文件处理程序,而 cron 从用户的主目录运行脚本。在这种情况下,python 无法找到用于文件处理程序的文件并将崩溃。

    我用于故障排除的是我创建了一个 crontab,如下所示。它会运行 start.sh 并将所有 stderror 或 stdoutput 扔到文件 status.txt 中,我在 status.txt 中收到错误,说我用于文件处理程序的文件没有找到。这是正确的,因为 python 脚本是由用户主目录中的 cron 执行的,然后脚本开始仅在主目录中搜索文件。

    @reboot /var/www/html/start.sh > /cronStatus/status.txt 2>&1
    

    这会将 cron 执行期间发生的所有事情写入 status.txt 文件。你可以在那里看到错误。我将再次建议使用 bash 脚本为 cronjobs 运行 python 脚本。

    解决方案:- 要么对脚本中使用的所有文件使用完整路径(这对我来说不可行,因为我不希望脚本依赖于位置)。或者您从正确的目录执行脚本 所以我创建了我的 cron 如下-

    @reboot cd /var/www/html/ && /var/www/html/start.sh
    

    此 cron 将首先将目录更改为正确的位置,然后启动脚本。现在我不必担心脚本中所有文件的硬编码完整路径。是的,虽然这听起来很懒惰;)
    我的 start.sh 看起来像-

    #!/bin/sh
    /usr/bin/python /var/www/html/script.py
    

    希望对你有帮助
    问候,
    克里斯

    【讨论】:

      【解决方案5】:

      我遇到了类似的问题,但情况略有不同:我有一个 bash 脚本 (run.sh) 和一个 Python 脚本 (hello.py)。当我输入

      sh run.sh
      

      从脚本目录,它工作;如果我在我的 crontab 中添加了 sh run.sh 命令,它不起作用。

      为了解决这个问题,我在 run.sh 脚本中添加了以下行:

      printenv > env.txt
      

      通过这种方式,您可以看到您(或 crontab)运行脚本时使用的环境变量。通过分析手动运行生成的 env.txt 和 crontab 运行之间的差异,我注意到 PWD 变量是不同的。在我的情况下,我可以通过在我的 .sh 脚本顶部添加以下行来解决:

      cd /PYTHON_SCRIPT_ABSOLUTE_PATH/
      

      希望对您有所帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-16
        • 2011-09-03
        • 2015-05-15
        • 1970-01-01
        • 2018-07-05
        • 2011-05-26
        • 2011-05-28
        相关资源
        最近更新 更多