我正在尝试在 python 3 中运行一个 cron 脚本,所以我必须设置一个虚拟环境(如果有更简单的方法,请告诉我)并且为了运行脚本我需要在脚本的父级中文件夹,因为它在那里写入文本文件。所以这是我想出的一长串命令,它在控制台中工作但在 cron 中不起作用(或者我找不到输出..)
如果 5 个星号不变成要点,我就无法输入它。但我在 cron 选项卡中有它们。
cd usr/local/sbin/cronjobs && . virtualenv/secret_ciphers/bin/activate && cd csgostatsbot && python3 CSGO_STATS_BOT_TASK.py && deactivate
最佳答案
看起来你可能有一只流浪猫 .
在那里可能会导致命令链中出现错误。
试试这个:
cd usr/local/sbin/cronjobs && virtualenv/secret_ciphers/bin/activate && cd csgostatsbot && python3 CSGO_STATS_BOT_TASK.py && deactivate
假设 virtualenv 目录在 cronjobs 目录中。
此外,您可能希望跳过激活/停用,直接从 virtualenv 运行 python3 解释器。即
/usr/local/sbin/cronjobs/virtualenv/secret_ciphers/bin/python3 /usr/local/sbin/cronjobs/csgostatsbot/CSGO_STATS_BOT_TASK.py
根据 OP 的评论进行编辑:
activate 调用激活了 virtualenv。不确定 .
是什么除了导致 shell 命令解析问题之外会做。
这两个示例都涉及到 virtualenv 的使用。您不需要显式调用activate。只要您从 virtualenv 的目录中调用解释器,您就在使用 virtualenv。 activate 本质上是一种方便的方法,可以调整您的 PATH 使 python3 和其他 bin 文件引用 virtualenv' s 目录而不是系统安装。
第二次编辑以回应来自 OP 的附加评论:
您应该重定向 stderr,即:
/usr/local/sbin/cronjobs/virtualenv/secret_ciphers/bin/python3 /usr/local/sbin/cronjobs/csgostatsbot/CSGO_STATS_BOT_TASK.py > /tmp/botlog.log 2>&1
看看是否会产生任何额外的信息。
此外,cron 中的 5 个星号将每 365 年 7 月 24 日每分钟运行该脚本。这真的是你想要的吗?
第三次编辑以回应来自 OP 的附加评论:
如果你想让它一直运行,我不确定你是否真的想使用 cron。即使有 5 个星号,它也会每分钟运行一次。这意味着它并不总是在运行。它每分钟运行一次,如果运行时间超过一分钟,您可能会运行多个副本(这可能会或可能不会成为问题,具体取决于您的代码),如果它运行得非常快,比如在几个秒,您将有剩余的时间等待它再次运行。
听起来您希望脚本本质上是一个守护进程。也就是说,只需在 while (True)
中运行主脚本即可。循环,然后只启动一次。然后你可以通过 <crtl>+c
退出它,否则它会一直运行。
关于python - 如何在树莓派或任何其他 unix 系统上编写多命令 cronjob,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25110635/