【问题标题】:Can I use java.awt.Robot from within a daemon?我可以在守护进程中使用 java.awt.Robot 吗?
【发布时间】:2011-05-22 08:00:45
【问题描述】:

我用 Java 编写了一个服务器,它允许连接到它的客户端控制计算机的鼠标和键盘。为此,它使用java.awt.Robot 类。

我需要此服务器在后台运行并自动启动。我要解决这个问题的第一个操作系统是基于 Debian 的(Ubuntu 11.04),而守护进程似乎是显而易见的选择。问题是,当守护进程在引导期间或安装我的 debian 包(其 postinst 脚本使用 /etc/init.d/pc-remote-server start 启动它)期间启动时,我收到此错误:

java.awt.AWTException: headless environment
    at java.awt.Robot.<init>(Robot.java:97)
    at com.se.pcremote.server.CommandExecuter.<init>(CommandExecuter.java:72)
    at com.se.pcremote.server.PCRemoteServer.<init>(PCRemoteServer.java:215)
    at com.se.pcremote.server.PCRemoteServer.main(PCRemoteServer.java:122)

有什么方法可以在守护进程中使用java.awt.Robot 类?我可以从不是“无头环境”的守护进程中生成一个辅助进程吗?还是有更好的方法让我获得没有此限制的类似“服务”的结果?

【问题讨论】:

    标签: java debian daemon


    【解决方案1】:

    “无头”表示此代码需要访问图形环境,而它没有。

    您可以通过提供一个系统属性在无头模式下运行,该属性提供了一个粗略的实现,它只提供了运行应用程序的基础知识,但很可能不支持机器人。不过还是先试试吧。

    如果您无法做到这一点,则需要为您的流程提供图形环境。执行此操作的常用方法是运行 VNC X-server,因为它不需要物理硬件,然后连接到它。

    【讨论】:

    • 在测试设置/不设置DISPLAY=:0.0和设置java.awt.headless=truejava.awt.headless=false的组合后,我想我已经确定:1)当没有DISPLAY环境变量时,Java会运行进入无头模式。 2) 如果您手动设置一个,它会欺骗 Java 进入无头模式。 3) 您可以设置java.awt.headless 来覆盖Java 在启动时决定的任何内容。 4) 如果你试图欺骗 Java,它只会崩溃而不是优雅地抛出异常。
    • 我现在要去查一下这个VNC业务。
    • 我已经弄清楚如何使用 x11vnc 启动 VNC 服务器并使用tightvnc 启动客户端,但这会打开一个显示您想要控制的屏幕的窗口(正如您所期望的那样)。有没有办法在不打开窗口的情况下进行连接,然后在该环境中运行 shell 命令?
    【解决方案2】:

    我假设,您必须正确设置 DISPLAY 变量(在机器人进程启动时的机器人进程环境中)才能正常工作——在您的情况下,您需要在 DISPLAY 中指定一个显示在程序启动后的某个时间创建的变量。 --

    不知道这是否真的有效,但你可以试一试,然后在这里报告它是否有效。

    【讨论】:

    • 我只是尝试在守护程序脚本启动之前设置和导出 DISPLAY 环境变量。当服务器启动时,我从 Java 中打印了所有环境变量,其中包括 DISPLAY=:0.0 但在尝试实例化机器人时看起来它崩溃了(没有例外)。我从未在 var/log/daemon.log 中看到任何内容
    【解决方案3】:

    好的,在做了更多的研究并尝试了更多的选择之后,我想到了:

    我可以在守护进程中使用 java.awt.Robot 吗? 不可以。

    在我的问题中,我进一步阐述了一点:

    有什么方法可以在守护进程中使用 java.awt.Robot 类吗? 没有。如上所述。

    我能否从守护进程中生成一个不是“无头环境”的辅助进程?我无法弄清楚。如果我真的这样做了,那将是很多工作。

    或者有没有更好的方法让我获得没有此限制的类似“服务”的结果? 是的!使用桌面环境!就我而言,因为我使用的是 Ubuntu,所以桌面环境是 Gnome。 Gnome 具有 启动应用程序 功能,该功能可以在全局和每个用户的基础上运行 .desktop 文件,如 here 所述。它们还提供有关这些 .desktop 文件here 的结构的信息。我将一个 .desktop 文件添加到运行我的 Java“服务”的/etc/xdg/autostart(全局自动启动文件夹),它就像一种享受。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多