在系统启动 Lubuntu 时运行 GUI Java jar

在系统启动 Lubuntu 时运行 GUI Java jar

我有一台运行 Lubuntu 14.10 且没有显示器的电脑。用户自动登录。我创建了一个 Sysvinit 脚本并将其安装在 /etc/init.d 上。我的脚本除其他外,启动一个 jar 文件,该文件打开一个侦听串行端口的 GUI 应用程序。

问题是我无法使 jar 应用程序在启动时自动启动。 Java 抱怨它无法连接到 X11 显示服务器。然而,这就是奇怪的事情。如果我 ssh 进入机器并使用 sudo 服务自己运行脚本,它会正常启动。此外,如果我在启动过程中连接了显示器,它也会自行正确启动。

在没有连接显示器的情况下如何启动脚本?似乎当监视器未连接时,Xorg 服务器不会启动。

答案1

您可以使用虚拟 X 帧缓冲区运行任何应用程序,例如Xvfb或者XVNC。您还应该考虑改用一种不会强制您连接正在运行的 X 的语言。

ssh如果你用它来连接到机器,那么事情就可以工作,这并不奇怪。尝试在首次输入后建立连接unset DISPLAY,或者执行以下操作

ssh -o "ForwardX11 no" owl

答案2

经过大量的故障排除和 @Anthon Anthon 的帮助,我终于实现了我想要的。问题归根结底是 X 服务器没有足够的时间来加载。 Xserver 是从 lightdm 启动的,这是一个新贵服务,我的脚本从 init.d 启动。

看起来,如果连接了监视器,X 服务器会更早启动,并且 init.d 中的脚本不会崩溃。

一个简单的sleep 10命令可以阻止脚本的执行,直到 X 服务器启动为止。然而,这是对 X 服务器启动时间的猜测。因此,一个更优雅的解决方案是检查桌面何时启动,然后启动我的应用程序。为了实现这一目标,我在启动脚本之前插入了以下几行。

while [ -z $(pidof lxsession) ]; do
   echo "LXSession not started yet, waiting for 2 secs"
   sleep 2
done

-z $(pidof lxsession)检查返回的 pidof 字符串是否为空。 (所以没有找到进程 lxsession 的 PID)。一旦 lxsession 启动,循环就会取消,脚本就会继续执行我的 java 应用程序,该应用程序现在找到 X 服务器并正常运行。

感谢大家的帮助。我希望其他人能受到这个帖子的帮助,而不是像我一样受到折磨!

相关内容