树莓派4B通过Cron@reboot启动Python虚拟环境脚本失败求助
树莓派4B通过Cron @reboot启动Python虚拟环境脚本的问题解决
问题场景
在树莓派4B(Raspi OS x64)上,尝试通过Cron的@reboot命令开机启动Python虚拟环境中的脚本,测试脚本test.sh有两种写法:
写法一:
. envname/bin/activate echo Hi Stackoverflow
写法二:
#!/bin/bash . envname/bin/activate echo Hi Stackoverflow
直接用sh test.sh执行脚本一切正常,但配置Cron开机启动:
@reboot sh /home/pi/test.sh >/home/pi/logs/cronlog 2>&1
时出现错误:
/home/pi/test.sh: 2: .: cannot open envname/bin/activate: No such file
补充说明:sh并非可行方案,Ubuntu默认使用bash而非sh,sh不支持source命令,bash用.替代source;同时怀疑开机启动时使用的shell可能和常规环境不同。
解决方法
1. 使用绝对路径指向虚拟环境
Cron执行@reboot任务时,默认工作目录不是用户的home目录,所以脚本里的相对路径envname/bin/activate会找不到文件。直接改用绝对路径即可解决:
修改test.sh内容:
#!/bin/bash # 替换成你的虚拟环境绝对路径 . /home/pi/envname/bin/activate echo Hi Stackoverflow # 这里添加要执行的Python脚本命令,例如: # python /home/pi/your_target_script.py
2. 让Cron使用bash执行脚本
脚本开头已经指定了#!/bin/bash,不要用sh去调用脚本,直接让Cron执行脚本本身(先给脚本添加执行权限):
- 给脚本赋予执行权限:
chmod +x /home/pi/test.sh
- 修改Cron配置:
@reboot /home/pi/test.sh >/home/pi/logs/cronlog 2>&1
这样Cron会遵循脚本指定的bash来执行,避免sh的兼容性问题。
3. 手动指定Cron的工作目录(可选)
如果坚持使用相对路径,可以在Cron命令中先切换到脚本所在目录:
@reboot cd /home/pi && sh /home/pi/test.sh >/home/pi/logs/cronlog 2>&1
不过前两种方法更稳定,优先推荐使用绝对路径的方式。
内容的提问来源于stack exchange,提问作者Towlie
相关产品推荐
相关产品推荐

