如何为这些命令创建cronjob?

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

我想在虚拟环境中每天运行一个python脚本。所以我试图设置一个cron作业,但它似乎没有执行。

如果我通常从终端运行程序,我会输入:

  1. source ig/venv/bin/activat进入以激活我的虚拟环境
  2. cd ig/mybot/src/导航到我的目录
  3. python ultimate.py运行我的程序

所以这是我的cron工作。我已将它设置为1以便每分钟运行,这样我就可以看到它正在运行但没有任何反应。

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

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

python bash cron virtualenv cron-task
2个回答
0
投票

你可以用另一个python脚本本身包装它。创建一个新的python脚本并运行它而不是cron。

看看subprocess模块。

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

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

有了上述两个,你的问题将得到解决。


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

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

如果你传递这样的值,python脚本,当它从stdin请求一个值时,它将使用你回显的值(逐行,第一行是第一个输入,依此类推)

这可能是一种方式。

个人,当我做cronjobs我喜欢直接运行bash脚本,因为,我可以添加额外的日志记录,所以使用包装脚本似乎并不合理。

你可以做的另一件事,就是获得python可执行路径(用于虚拟环境),并将其用作解释器,将#!/usr/bin/env python替换为#!/path/to/pythons/virtual/env/interpreter,但你不会得到.env variables(可能有办法实际获得他们。

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