【问题标题】:Launch a GTK# application from a Linux service从 Linux 服务启动 GTK# 应用程序
【发布时间】: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 服务器时才能工作。

标签: c# linux mono gtk#


【解决方案1】:

如果不将程序分成两个或多个部分,您将无法轻松做到这一点。

在引导期间作为服务启动时,您的程序将以 root 或其他指定用户身份运行。它不会有关联的 X 会话(X 可能也没有启动)。

当 GTK 主循环(通过 Application.Init)启动时,它会尝试联系它无法找到的 X 服务器,或者它可能没有使用权限。

您应该将程序拆分为后台服务和 GUI,将两者塞进同一个东西中也会有开发缺陷。

另外,大概,您的服务有某种客户端程序?为什么你的 GUI 也不能作为客户端单独启动?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-22
    • 2011-04-04
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多