如何使 /etc/init.d 脚本像在 X 下启动一样?

如何使 /etc/init.d 脚本像在 X 下启动一样?

我正在尝试追踪 Java 应用程序的一些怪异之处,该应用程序在通过 /etc/init.d 中的启动脚本启动时表现不佳,但当您打开 GUI 终端窗口并通过 /etc/init.d/ 运行它时运行良好myapp 启动。 (奇怪之处在于应用程序的一部分使用 X 进行了一些黑客操作。)由于该应用程序在通过终端窗口启动时运行良好,因此在深入研究(诚然是精致的,不是我的)源代码之前,我正在研究它是如何启动的代码。

答案在这个帖子给了我一个线索,Gnome 终端正在窗口管理器内运行,这在某种程度上影响(以良好的方式)我通过 bash 脚本启动的应用程序的环境。我能够验证通过 tty 终端(ctrl-alt-f1 或通过 ssh)启动脚本与启动时启动的行为相同。

我的主要问题:我该怎么做才能在计算机启动时启动该应用程序,但它的行为就像在 X 下启动一样?到目前为止,我们已经完成了脚本路线,因为它还需要使用某些参数启动 Java VM。

后续问题(严格来说是为了增强我的理解):当脚本通过窗口管理器中运行的内容启动时,幕后发生了什么使脚本表现不同?谷歌还没有在这方面启发我。

答案1

/etc/init.d脚本是非交互式、非登录的,并且它们不会尝试访问 X 会话,因为它们是系统范围服务。1 系统服务不与任何特定的登录user, 2但 X 会话始终属于登录用户。

如果您的应用程序需要 GUI 上下文才能工作,那么它不应该是系统服务。你还没有解释为什么它需要那个或它能做什么,但您可能应该使用~/.xinitrc桌面环境的启动系统,而不是 init。

1 X 应用程序和登录用户可能会使用系统服务,但您所说的是相反的情况。

2服务通常与其自己的特殊用户相关联,但它们并不 登录因此(通常这样的用户不能已登录)。

答案2

如果您的应用程序出于某种奇怪的原因需要 X 服务器,但没有用它做任何有用的事情,请给它一个虚拟 X 服务器。这样做通常是为了在 Web 应用程序的自动化测试套件中运行 Web 浏览器——没有人看屏幕,但如果没有屏幕,Web 浏览器就无法运行。

Xvfb创建一个仅“显示”到内存而不是任何可见内容的 X 服务器。它不需要任何硬件或权限。

最简单的使用方法是通过 Debianxvfb-run脚本。

xvfb-run java MyWeirdApp

如果您没有xvfb-run,请从众多之一处获取副本在网络上或来自Debian 软件包

相关内容