【问题标题】:Django: Cron job is not executing python scriptDjango:Cron 作业没有执行 python 脚本
【发布时间】:2014-02-25 19:25:27
【问题描述】:

我正在使用 csvimporter 将一些 csv 文件导入 Django 模型。我有 2 个脚本 - 一个用于获取文件的 python 脚本:

import subprocess

subprocess.call("python manage.py csvimport --model='csv_reader.csv' /Users/path_to_csv", shell = True)

还有一个用于从模型中删除对象的 django 脚本:

from csv_reader.models import *

csv.objects.all().delete()

从 shell 手动运行时,这两个脚本都可以正常工作。但是当我添加一个 cron 作业来执行脚本时,它不起作用,尽管它会将它们记录在 cron 日志中:

Feb 25 10:21:00 Liubous-MacBook-Pro.local /usr/sbin/cron[43055]: (yudasinal1) CMD (/Users/path_to_script)

我尝试像这样添加一个 cronjob:

DJANGO_SETTINGS_MODULE=project.settings
* * * * * /Users/path_to_csv/test_subprocess.py

在实际脚本中,我在文件顶部添加了#!/usr/bin/env python

以及我尝试添加此 cronjob:

DJANGO_SETTINGS_MODULE=project.settings
    * * * * * python /Users/path_to_csv/test_subprocess.py

所有这些都记录到 cron 日志中,但不幸的是,实际功能没有被执行。

任何帮助将不胜感激!

【问题讨论】:

  • 用芹菜代替:)
  • 一开始我在考虑使用 celery,但后来我想也许这两个简单的操作 celery 可能太多了,因为它提供的不仅仅是调度任务
  • (9 小时后)如果你仍然有这个问题,请考虑使用 celery :) 哈哈
  • @pleasedontbelong 我想你可能是对的 :P 现在试试芹菜哈哈

标签: python django cron


【解决方案1】:

第 1 步:将 Shebang 添加到脚本中

Unix 脚本使用名为“Shebang”的行

所以你的第一行应该是这样的:

#!/usr/bin/env python

第 2 步:使脚本可执行

  1. 转到包含您的脚本的文件夹mysript.py
  2. 在控制台中执行chmod +x myscript.py
  3. 通过使用./myscript.py 执行它来验证它是否可执行。

第 3 步:将其添加到 CRON

  1. 在终端输入crontab -e
  2. 像这样添加一行:

    30 13 * * * /home/yourusername/myscript.py

  3. 通过crontab -l 验证一切正常。

(更多信息请参见cyberciti.biz

调试 python 脚本

import datetime
import getpass

now = datetime.datetime.now()

# Open file to append
with open("/home/user/myscript.log", "a") as f:
    f.write("Script started at %i.%i.%i (%i:%i:%i) by %s" % (now.day, now.month, now.year, now.hour, now.minute, now.second, getpass.getuser()))

[...]
with open("/home/user/myscript.log", "a") as f:
    f.write("File 'xy' was opened.")

【讨论】:

  • 我按照您的建议一步一步地执行(脚本完成了我运行 ./myscript.py 时的预期操作),并且它还记录在 cron 日志 /var/log/cron.log 中。我的 cronjob 现在看起来像这样: * * * * * /Users/path_to_script/test_subprocess.py 但是,不幸的是,当我检查是否导入了 csv 文件(这就是脚本所做的)时,它不是。您对可能出现的问题还有其他建议吗?谢谢!
  • 嗯。我最近遇到了一个奇怪的问题,即 TCL 脚本使用了环境变量。在这种情况下,我可以通过 tclsh 或 janus(另一个类似 shell 的环境)执行脚本并得到不同的结果。您是否在脚本中使用环境变量?我建议在test_subprocess.py 中添加一些将某些内容写入日志文件的行。在开头写一些东西(例如“执行开始于 12:31”),并在“关键”部分写更多日志(例如“打开的文件 xy”、“开始导入”、“结束导入”……)
  • @yudasinal:我从来没有只在 crontab 中看到过星星。更像是*/1 * * * * /Users/path_to_script/test_subprocess.py。但我不知道到底有什么区别。我认为两者都应该每分钟执行一次。
  • 是的,这很奇怪。我的脚本看起来与原始问题中的第一个代码 sn-p 完全相同。我不太确定,如何将 cmets 写入要放入日志文件的文件中?
  • 感谢您的调试示例。当我手动运行脚本时,它会将其记录到日志文件中。使用 cron,文件中不会写入任何内容。这意味着它甚至没有打开文件:/
【解决方案2】:

首先检查您的 crontab 是否正在运行。添加作业以在 tmp 文件夹中创建文件。如果它正在运行。尝试为 python 提供完整路径

* /usr/bin/python /home/你的 django 项目的路径/manage.py ...

【讨论】:

    【解决方案3】:

    !/usr/bin/env python 很好

    只需将项目设置完整路径设置为 DJANGO_SETTINGS_MODULE

    DJANGO_SETTINGS_MODULE=/Users/path_to_project/project.settings

            • python /Users/path_to_csv/test_subprocess.py

    【讨论】:

    • @Özgür_Eroğlu 所以我将 #!/usr/bin/env python 留在了文件中,并将我的 cronjob 更改为:DJANGO_SETTINGS_MODULE=/Users/path_to_settings/settings.py * * * * * /Users /path_to_script/test_subprocess.py 不幸的是,仍然没有任何效果:(
    【解决方案4】:

    在您的终端中写入 crotab -e 。把你的

    * * * * * /usr/bin/python /Users/path_to_csv/test_subprocess.py
    

    并在test_subprocess.py中添加

    DJANGO_SETTINGS_MODULE=project.settings
    

    还要注意,DJANGO_SETTINGS_MODULE=project.settings 仅在您在项目文件夹中运行此 cron 作业时才有效。所以最好用 DJANGO_SETTINGS_MODULE=/pathToProject/project.settings

    【讨论】:

      猜你喜欢
      • 2012-03-02
      • 2015-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-12
      • 1970-01-01
      • 2018-06-11
      • 1970-01-01
      相关资源
      最近更新 更多