Python脚本没有在cron中运行

时间:2014-09-25 22:57:02

标签: python bash shell cron

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

从shell运行脚本时,脚本可以正常工作,但在使用crontab时则不行。我确实检查了/var/log/cron文件,看到脚本运行但是stdoutstderr绝对没有任何内容。

最后,我创建了一个打印日期和字符串的小脚本,并且每隔一分钟调用一次,但是其他脚本没有。我不确定为什么我得到这些可变结果......

以下是crontab

中的条目
SHELL=/bin/bash



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

以下是我的脚本的源代码,它不会从crontab运行,但是会在调用./script.py时从它运行的shell运行。在我使用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()

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

5 个答案:

答案 0 :(得分:3)

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

  1. 将cron修改为/path/to/script/script.py > /tmp/log 2> &1
  2. 现在,让cron运行
  3. 现在阅读文件/tmp/log
  4. 您将找到您遇到的问题的原因,以便您可以解决它。
  5. 根据我的经验,问题主要与环境有关 在cron中,未设置env变量。因此,您可能必须在cron中为脚本显式设置env。

答案 1 :(得分:3)

好吧,我猜这个帖子仍然会帮助googlers 我使用一种解决方法来运行带有cron作业的python脚本。事实上,python脚本需要通过cron job精心处理 所以我让一个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脚本。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我还要强调一件事。我试图使用相同的技巧(使用shell脚本)在cron中运行python脚本,但这次它没有运行。这是@reboot cron。因此,我在上述评论之一中提到了在crontab中使用了重定向。并了解问题所在。 我在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

希望对您有帮助
问候,
克里斯(Kriss)

答案 4 :(得分:0)

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

sh run.sh

在脚本目录中有效;如果我在crontab中添加了 sh run.sh 命令,则该命令无效。

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

printenv > env.txt

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

cd /PYTHON_SCRIPT_ABSOLUTE_PATH/

希望这可以帮助您!