您好。
我正在尝试使用MacOS cron作业执行异步Django自定义命令,但似乎没有任何工作。
首先,我尝试编写一个源自virtualenv的bash文件,然后使用我的自定义命令执行manage.py:
#!/bin/bash
source "/Users/airiefenix//Workspaces/ytsm_container/venv/bin/activate" && python /.../manage.py my_command
但我得到了
File "manage.py", line 17, in <module>
"Couldn't import Django. Are you sure it's installed and (...)
因此源代码无法处理我的bash脚本。我尝试了很多方法,包括替换源代码。 (点运算符),将脚本分成两行或多行等。显然,没有办法从bash脚本激活virtualenv所以我放弃了并创建了一个别名
$ alias python_ytsm="/Users/airiefenix/Workspace/ytsm_container/venv/bin/python3.6"
运行“python_ytsm /.../manage.py my_command”可以很好地工作,但是当我将它添加到cron列表时:
$ crontab -e
Cron文件:
01 * * * * python_ytsm "/Users/airiefenix/Workspace/ytsm_container/project/manage.py my_command"
绝对没有任何反应。我已经用crontab -l检查了cron作业列表,我的脚本就在那里。我还使用基本命令添加了一些其他行到crontab文件,例如“touch file.txt”或“echo'hello'&gt;&gt; somefile.txt”,所有这些作业都正常执行。
有什么问题?是我的别名吗?它是“custom / virtualenv”Python解释器吗?我想提供更多详细信息,但MacOS在记录cron工作时非常缺乏。
我正在使用MacOS Sierra,我知道cron应该被弃用了但是对我来说它比使用launchdl要容易得多,所以除非我绝对不能通过cron使它工作我想继续使用它。感谢。
答案 0 :(得分:1)
默认情况下,非交互式shell中禁用别名,因此即使您获取定义它们的文件,也不会被尊重。此外,dotfiles并非来自非交互式shell启动,因此您的.bashrc
,.bash_profile
,.profile
或您可能已定义别名的其他位置不会被取消从cron调用命令时进行评估。
如果确实想要别名,请考虑:
# instruct cron to use bash as your shell
SHELL=/bin/bash
# . "$HOME/.bashrc" <- assumes that your .bashrc defines the alias python_ytsm
# shopt -s expand_aliases <- turns aliases on; off-by-default in noninteractive context
# ...and then your regular command.
01 * * * * . "$HOME/.bashrc" && shopt -s expand_aliases && python_ytsm "/Users/airiefenix/Workspace/ytsm_container/project/manage.py my_command"
但不要依赖它们,这是更好的做法。