我在 Ubuntu Destkop 14.04 LTS 中的控制台创建了一个用户,执行以下操作:
sudo addgroup hadoop
sudo adduser --ingroup hadoop hduser
我使用该用户来做各种事情,因为我用它来做一些与 Hadoop 相关的编程工作,所以我知道它运行良好,总是从控制台使用它并在没有 GUI 的情况下执行东西。我想用这个用户打开 Eclipse (Luna),因此我执行以下操作:
su hduser
cd /opt/eclipse
./eclipse
但它引发了一个错误:
!MESSAGE Application error
!STACK 1
org.eclipse.swt.SWTError: No more handles [gtk_init_check() failed]
at org.eclipse.swt.SWT.error(SWT.java:4467)
at org.eclipse.swt.widgets.Display.createDisplay(Display.java:934)
at org.eclipse.swt.widgets.Display.create(Display.java:918)
at org.eclipse.swt.graphics.Device.<init>(Device.java:157)
at org.eclipse.swt.widgets.Display.<init>(Display.java:514)
at org.eclipse.swt.widgets.Display.<init>(Display.java:505)
at org.eclipse.ui.internal.Workbench.createDisplay(Workbench.java:732)
at org.eclipse.ui.PlatformUI.createDisplay(PlatformUI.java:162)
at org.eclipse.ui.internal.ide.application.IDEApplication.createDisplay$
at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEAppl$
at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHand$
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runAppl$
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(E$
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.j$
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.j$
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl$
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcce$
at java.lang.reflect.Method.invoke(Method.java:606)
at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:648)
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:603)
at org.eclipse.equinox.launcher.Main.run(Main.java:1465)
at org.eclipse.equinox.launcher.Main.main(Main.java:1438)
但是,如果我使用我的“主用户”(与我用于登录我的 ubuntu 桌面的用户相同)从控制台打开 eclipse,那么 eclipse 就可以完美打开。
这就是为什么我怀疑两个用户之间存在的差异不允许我这样做,我怀疑问题在于hd用户没有适合在图形环境中使用的正确配置。我说得对吗?可以修改 hduser 以便让我打开 eclipse 吗?
答案1
尝试执行这个命令:
export DISPLAY=:0
它确保在执行 Eclipse 之前知道要使用哪个 X 显示器。
如果这不起作用,该用户可能还需要窗口管理器的配置文件。因此,只需执行添加新用户的 GUI 路径(我相信它位于首选项 → 用户和组),这样所有的默认配置都会被加载。
答案2
我在 CentOS 6.x 上安装 IBM Installation Manager (IBMIM) 时遇到了类似的问题,并通过安装几个导致此相同错误的软件包解决了该问题:
$ sudo /opt/IBM/InstallationManager/eclipse/IBMIM \
-record /root/was8nd_v85_install.xml \
-skipInstall /tmp/was8nd
00:00.46 ERROR [main] org.eclipse.equinox.log.internal.ExtendedLogReaderServiceFactory safeLogged
Application error
org.eclipse.swt.SWTError: No more handles [gtk_init_check() failed]
org.eclipse.swt.SWTError: No more handles [gtk_init_check() failed]
at org.eclipse.swt.SWT.error(SWT.java:4387)
at org.eclipse.swt.widgets.Display.createDisplay(Display.java:913)
at org.eclipse.swt.widgets.Display.create(Display.java:899)
at org.eclipse.swt.graphics.Device.<init>(Device.java:156)
...
IBMIM:
An error has occurred. See the log file
/opt/IBM/InstallationManager/eclipse/configuration/1457978953529.log.
解决方案第 1 部分 - 缺少软件包
$ sudo yum install \
gtk2 \
libXtst \
gnome-desktop \
xorg-x11-xauth \
dejavu-lgc-sans-fonts
在 Ubuntu 上也可以完成类似的事情。
解决方案第 2 部分 - xauth
另一个可能出现的问题是您尝试通过 sudo 以 root 用户身份运行 IBMIM 安装程序(基于 Eclipse)。执行此操作时,您会从安装程序中收到上述应用程序错误:
00:00.46 ERROR [main] org.eclipse.equinox.log.internal.ExtendedLogReaderServiceFactory safeLogged
Application error
org.eclipse.swt.SWTError: No more handles [gtk_init_check() failed]
org.eclipse.swt.SWTError: No more handles [gtk_init_check() failed]
为了解决这个问题,您需要使用xauth add
将您以 root 身份登录的初始用户添加到$HOME/.Xauthority
文件中。
作为用户1:
$ xauth list
ip-10-10-10-10.us-west-1.compute.internal/unix:10 MIT-MAGIC-COOKIE-1 6902e8c245a01ca50XXXXXXXXXXXXXXXX
然后以 root 身份:
$ xauth add ip-10-10-10-10.us-west-1.compute.internal/unix:10 MIT-MAGIC-COOKIE-1 6902e8c245a01ca50XXXXXXXXXXXXXXXX
xauth: creating new authority file /root/.Xauthority
$ xauth list
ip-10-10-10-10.us-west-1.compute.internal/unix:10 MIT-MAGIC-COOKIE-1 6902e8c245a01ca50XXXXXXXXXXXXXXXX