如何在 crontab 中使用 screen 运行 Python venv 脚本

如何在 crontab 中使用 screen 运行 Python venv 脚本

我有一个 sh 脚本,其内容如下:

screen -mdS myscript /home/myscript/myscript_env/bin/python3 /home/myscript/bot.py

该脚本执行一个python脚本并在新屏幕中打开它。

在终端中执行 sh 文件时,它工作正常,但是在重新启动时使用 crontab 执行此 sh 脚本时,它不起作用:

@reboot ./home/myscript/start.sh

答案1

首先,脚本应该以指向将运行它的解释器的 shebang 开头,尤其是当将它传递给除现有 shell 之外的其他东西来运行它时,因为您不知道将使用什么环境。因此,完整的脚本可能看起来像

#!/bin/sh
screen -mdS myscript /home/myscript/myscript_env/bin/python3

其次,正如我在链接的问题中提到的那样,@reboot并不总是支持所有用户,或者根本不支持。

让某些东西在启动时启动的更好选择是 systemd 服务(假设您使用的不是太旧而无法使用 init.d 脚本的东西)。关于如何设置服务的合理讨论是这里

答案2

cron 生成的邮件中是否有任何输出?尝试检查 crontab 包含此条目的用户的 cron 或邮件日志,这应该会给出有关该问题的提示。

乍一看,我认为原因可能是.命令中的额外内容。尝试更改

@reboot ./home/myscript/start.sh

@reboot /home/myscript/start.sh

看看是否有帮助。

据我所知,cronjob 从用户的主目录(例如/root)而不是文件系统根目录(即/)运行命令。

答案3

您的 shell 脚本应该在顶部有#!/bin/bash#!/bin/sh。或者如果它是通过 crontab 调用的,则应该使用 或 来调用/bin/sh/bin/bash your-script与 crontab 相比,另一种解决方案是利用文件的优势 "/etc/rc.d/rc.local"

由于此文件已在启动时运行,我们可以添加一行来调用我们的脚本:
sh screen -mdS myscript /home/myscript/myscript_env/bin/python3

只需要确保 rc.local 文件本身是可执行的:

chmod +x /etc/rc.d/rc.local

相关内容