Crontab是一个运行特定virtualenv的Python解释器的别名,为什么不起作用?

时间:2017-07-25 16:22:53

标签: python bash macos cron

您好。

我正在尝试使用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使它工作我想继续使用它。感谢。

1 个答案:

答案 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"

但不要依赖它们,这是更好的做法。