我有一个与 pygame 示例末尾的脚本非常相似的脚本页,我想在启动时运行它,使整个系统在启动时监听命令。我运行了“crontab -e”,并将“@reboot python3 myscript.py”作为第一行。重新启动后,脚本不起作用,并返回 pygame.error: 视频系统未初始化。另一方面,如果我从终端执行“python3 myscript.py”,该脚本就会起作用。
绝大多数答案只是指出 pygame.init() 没有被调用,但这里的情况并非如此。根据一个邮政从德语翻译过来,这可以通过在某处导出变量来解决,但我不确定在哪里或如何做到这一点。
有没有办法为 Crontab 重新启动时运行的脚本授予 X11 权限?
更新:在像 Seamus 建议的那样链接命令时,设置 DISPLAY=:0 根本不起作用。登录后从终端,我回显 $DISPLAY 并得到:1。设置时:
@reboot (sleep 30; export DISPLAY=:1; python3 /full/path/to/myscript.py)
它在登录后开始工作,但之前不能工作(这是我的主要要求,因为设备应该是自主的)。我不确定这 :1 是否相关以及 :0 是什么。
答案1
如果您的脚本从命令行运行,而不是从 运行cron
,则有两个常见的嫌疑点:
- 的 PATH
cron
与您作为“普通”用户的路径不同。您可以通过使用脚本的完整路径规范来解决该问题:
@reboot python3 /full/path/to/myscript.py
cron
启动时不知道任何服务的状态。对于cron
,@reboot
表示cron
启动时,而不是网络启动时或您的cron
工作可能需要的任何其他服务时。解决这个问题的一种方法是sleep
在运行脚本之前先运行一下:
@reboot (sleep 30; python3 /full/path/to/myscript.py)
这将使脚本的执行延迟 30 秒。 30 秒没什么神奇的……这取决于您的系统。您可能希望进行一些试验和错误测试,以找到可靠的睡眠时间。
cron
请注意,另一种避免系统服务状态缺点的方法是使用systemd
.有些人(包括我自己)发现cron
更容易使用,但肯定systemd
有一些优点。
最后,收集启动脚本时生成的任何错误消息通常是个好主意。您将在单行中添加另一个内容crontab
来实现这一点:
@reboot (sleep 30; python3 /full/path/to/myscript.py >> /home/yours/cronjoblog) 2>&1
任何错误消息都stderr
将附加到您指定的文件中。