从Linux服务启动GTK#应用程序

时间:2011-11-21 18:52:51

标签: c# linux mono gtk#

环境
RHEL 5.7,64位
运行级别5
mono 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.Run()之前调用Gtk.Application.Init(),它会尝试对x服务器执行某些操作 - 这显然会导致运行级别3出现问题。但是,我们的计算机将始终在运行级别5中启动

启动另外两个的主应用程序是作为服务设置的,因为它正在进行的整个系统要求它在启动时作为服务启动。那么,有没有办法在用户交互模式下运行它? (即使他们实际上不会直接与它进行交互)

1 个答案:

答案 0 :(得分:0)

如果不将程序分成两部分或更多部分,您将无法轻松完成此任务。

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

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

您应该将程序拆分为后台服务和GUI,同时填写两者也存在开发缺陷。

另外,据推测,您的服务有某种客户端程序?为什么您的GUI也不能成为客户端并单独启动?