如何为这些命令创建cronjob?

时间:2019-02-21 16:21:03

标签: python bash cron virtualenv cron-task

我想完成一项cron任务,以便每天在虚拟环境中运行python脚本。因此,我试图设置一个cron作业,但它似乎没有执行。

如果要从终端正常运行程序,请输入:

  1. source ig/venv/bin/activat输入以激活我的虚拟环境

  2. cd ig/mybot/src/导航到我的目录

  3. python ultimate.py运行我的程序

这真是我的工作。我将其设置为1,使其每分钟运行一次,以便可以看到它正在运行,但是什么也没发生。

1   *   *   *   *   source ig/venv/bin/activate && cd ig/mybot/src/ && python ultimate.py

编辑:我已经更新了程序,因此不需要命令行提示符。我只需要运行这三个简单的命令即可。

2 个答案:

答案 0 :(得分:0)

您可以使用另一个python脚本本身将其包装起来。创建一个新的python脚本并运行它而不是cron。

看看subprocess模块。

示例: 您的命令将变为subprocess.call(['source','ig/venv/bin/activate']) 在包装器python脚本中。

此外,input("Enter the value")会提示您输入用户信息。

使用以上两种方法,您的问题将得到Python解决。

答案 1 :(得分:0)

我不确定这是否是个好主意,但是您可以执行这样的脚本。

#!/usr/bin/env bash

PYTHON_PROJECT_DIR=/path/to/python/project/dir

pushd ${PYTHON_PROJECT_DIR}

VALUES="first line of stream\nsecondline of stream\n"

pipenv run /path/to/your/script.py < (echo -e $VALUES)

popd

pushdpopd是与目录堆栈一起移动的命令,因此您将位于堆栈顶部的目录中,因此,通过添加一个目录,您 move < / em>到工作目录,然后弹出将返回到初始位置。

使用pipenv可让您在虚拟环境中运行脚本(配置起来并不难),这样您就可以在项目的.env文件中使用环境变量,并且您将只使用该项目的依赖项。 (与python相关)。

如果您传递这样的值,则python脚本在从stdin请求值时,都会使用您回显的值(逐行,第一行是第一个输入,依此类推)

这可能是一种方法。

我个人每次cronjobs时都喜欢直接运行bash脚本,因为我可以添加额外的日志记录,因此拥有包装器脚本似乎并不是没有道理的。

您可以做的另一件事是,通过将#!/usr/bin/env python替换为#!/path/to/pythons/virtual/env/interpreter来获取python可执行路径(用于虚拟环境),并将其用作解释器。 但您不会获得.env variables(也许有一种方法可以真正获得它们。