我有一个 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