【发布时间】:2021-10-21 06:24:04
【问题描述】:
我已经定义了一个 django 管理命令,它将一些数据导入我的应用程序数据库。我使用 crontab 运行它。旁注:一切都在 docker 容器内。当我在容器的 shell 中手动使用该命令时,它可以完美运行。但是,当 crontab 尝试运行它时,什么也没有发生。
我的 crontab 行如下:
* * * * * nice -n 19 /usr/local/bin/python3 /code/manage.py my_command "a string argument for my command" # a comment to find the cron easily
(我将代码放入 /code 是因为当时这似乎是个好主意。)
我知道 crontab 会调用我的命令,因为 /var/log/syslog 在执行时会显示。我无法理解为什么什么都没有发生的原因。
作为对我命令的“句柄”方法的测试,我在第一行写了print("handling command"),然后在我的crontab 行的末尾添加了>> /code/cron.log。文本没有出现在文件中。
有什么想法吗?
编辑
我在 manage.py 中添加了一些“打印”语句,它们出现在日志文件中。这些打印在execute_from_command_line(sys.argv) 语句之前有效。这意味着这个函数出了问题(从 django.core.management 导入)。
我会继续调查。
编辑 2
在 Django 框架中打印了很多东西后,我在 AppConfig.ready 方法中找到了我的 apps.py 文件。在这里,我定义了一个函数,如果 cron 服务还没有启动,它会启动它。为此,我使用了 subprocess.Popen tu run service cron status。
此时,cron 执行不再进行。 我不明白为什么它会停在那里,但在我看来 cron 拒绝产生新进程。 (我在 AppConfig.ready 中有那个函数,因为我读到这段代码只执行了一次。)
【问题讨论】: