【发布时间】:2011-11-21 18:52:51
【问题描述】:
环境:
RHEL 5.7,64 位
运行级别 5
单声道 2.6.7
我有一个 C# 控制台应用程序,它在启动时作为服务运行。从该应用程序的代码中,它启动两个也是 C# 应用程序的进程。一个是另一个控制台应用程序,一个是 GTK 应用程序(但设置为不显示其 GUI 窗口)。
正常运行这个主应用程序 (mono app.exe) 工作正常。但是,当作为服务运行时,GTK 应用程序在 Application.Init() 处崩溃,并显示“GTK-无法打开显示”错误消息。
当我们尝试在运行级别 3 中直接运行 GTK 应用程序(又名“mono appname.exe”)时,我们也会看到该错误消息(假设因为 Application.Init() 对不存在的窗口管理器做了一些事情) .那么,即使我们在运行级别 5 中启动机器,Linux 服务是否以某种方式在运行级别 3 中启动?如果是这样,有没有办法强制它在运行级别 5 运行?
谢谢。
编辑 - 更多信息: GTK 应用程序设置为可以通过命令行参数启动或不启动其 GUI 运行。但是,我们使用 Gtk.Application.Run() 从 main 启动应用程序,无论它以哪种方式运行。 Gtk.Application.Init() 必须在 Gtk.Application.Run() 之前调用,它会尝试对 x 服务器做一些事情——这显然会导致运行级别 3 出现问题。但是,我们的机器将始终在运行级别 5 中启动.
启动其他两个的主应用程序设置为服务,因为它正在运行的整个系统要求它在启动时作为服务启动。那么,有没有办法在用户交互模式下运行它? (即使他们实际上不会直接与之交互)
【问题讨论】:
-
我对 GTK# 不是很熟悉,所以我不想假设答案,但在我看来,这里的困难在于守护程序/后台服务通常不会在用户交互模式和进程在没有运行 X 的初始化实例的隔离范围内运行。尝试从未设置为在用户交互模式下运行的 Windows 服务运行 Windows 窗体应用程序时,您会遇到同样的问题。既然这是一个后台服务,为什么它需要一个 GUI?也许解决方案是以不同的方式思考问题。
-
Mono 本身或您的应用程序有一个错误,因为它仍在尝试连接到 X 服务器,即使您声称它已设置为不显示其 GUI。
-
Vlad:是的,在我的 Main 类中,Application.Init 尝试连接到 X 服务器,没有它我无法运行 Application.Run。我们没有做的是实例化 GUI 窗口(另一个类)。理论上应该没问题,因为我们可以在运行级别 5 上运行。
-
TheXenocide:有没有办法在 linux 中将服务设置为用户交互模式?
-
GTK 应用程序在没有 X 的情况下无法运行,Application.Init() 仅在您的 DISPLAY 环境变量指向有效的 X 服务器时才能工作。