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

问题描述 投票:0回答:1

我正在尝试使用 MacOS cron 作业执行异步 Django 自定义命令,但似乎没有任何效果。

首先,我尝试编写一个 bash 文件来获取 virtualenv,然后使用我的自定义命令执行 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 作业列表,我的脚本就在那里。我还使用基本命令(例如“touch file.txt”或“echo 'hello' >> somefile.txt”)向 crontab 文件添加了一些其他行,并且所有这些作业都正常执行。

有什么问题吗?是用我的别名吗?是使用“custom/virtualenv”Python 解释器吗?我很想提供更多细节,但 MacOS 在记录 cron 作业时极其稀缺。

我正在使用 MacOS Sierra,我知道 cron 据说已被弃用,但对我来说,它比使用 launchdl 容易得多,所以除非我绝对无法通过 cron 使其工作,否则我想继续使用它。

python bash macos cron
1个回答
2
投票

默认情况下,在非交互式 shell 中别名是禁用的,因此即使您获取定义它们的文件,也不会尊重它们。此外,点文件不是在非交互式 shell 启动时获取的,因此当从 cron 调用命令时,不会评估您的

.bashrc
.bash_profile
.profile
或您可能定义别名的其他位置。

如果您真的想要别名,请考虑:

# 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"

但最好不要依赖它们。

© www.soinside.com 2019 - 2024. All rights reserved.