我正在尝试从cron运行一个Django管理命令。我正在使用virtualenv来保持我的项目沙箱。
我在这里和其他地方看到过从virtualenv中运行管理命令的示例,如:
0 3 * * * source /home/user/project/env/bin/activate && /home/user/project/manage.py command arg但是,即使syslog显示了任务应该何时启动的条目,此任务也从未实际运行过(脚本的日志文件为空)。如果我从shell中手动运行这行代码,它将按预期工作。
目前,我可以通过cron运行命令的唯一方法是将命令拆分,并将它们放入一个愚蠢的bash包装器脚本中:
#!/bin/sh
source /home/user/project/env/bin/activate
cd /home/user/project/
./manage.py command arg编辑:
ars提出了一个有效的命令组合:
0 3 * * * cd /home/user/project && /home/user/project/env/bin/python /home/user/project/manage.py command arg至少在我的例子中,调用virtualenv的激活脚本没有做任何事情。这是可行的,所以在节目中也是如此。
发布于 2021-09-02 23:04:29
这是一种使crontab命令与常规命令非常相似的简单方法(在Ubuntu 18.04中进行了测试)。需要牢记的一些要点:
.命令代替source。(crontab默认使用sh,而不是bash,所以它没有在crontab命令中展开source.)~和$variables。(只有crontab环境语句不进行变量扩展。)如果您有一个~/myproject/main.py文件,下面是一些示例
* * * * * cd ~/myproject && . .venv/bin/activate && python main.py > /tmp/out1 2>&1您也可以直接调用venv目录中python的具体路径,这样就不需要调用activate了。
* * * * * ~/myproject/.venv/bin/python ~/myproject/main.py > /tmp/out2 2>&1这样做的缺点是您需要指定项目路径两次,这使得维护变得更加棘手。为了避免这种情况,您可以使用shell变量,以便只指定一次项目路径:
* * * * * project_dir=~/myproject ; $project_dir/.venv/bin/python $project_dir/main.py > /tmp/out3 2>&1https://stackoverflow.com/questions/3287038
复制相似问题