Crontab 中的 X11 和 pygame

Crontab 中的 X11 和 pygame

我有一个与 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,则有两个常见的嫌疑点:

  1. 的 PATHcron与您作为“普通”用户的路径不同。您可以通过使用脚本的完整路径规范来解决该问题:
@reboot python3 /full/path/to/myscript.py 
  1. 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 将附加到您指定的文件中。

相关内容