【问题标题】:Cannot launch GUI programs from systemd service无法从 systemd 服务启动 GUI 程序
【发布时间】:2017-01-04 08:33:13
【问题描述】:

我有一个 Spring Boot 应用程序,我通过 Ubuntu 中的 systemd 服务执行它,在使用 sudo startkde 启动 X 服务器后,我无法使用像 gedit 这样的命令行从应用程序启动 GUI 程序,同时它可以工作当我使用 sudo java -jar demo.jar 启动应用程序时,我尝试将 gedit 命令放在 shell 脚本中,但问题仍然存在。

是否有任何解决方案可以使用该服务并启动 GUI 程序,或者使用其他可以解决问题的服务启动 spring boot。

这是 systemd 服务:

[Unit]
Description=demo
After=syslog.target

[Service]
User=ubuntu
ExecStart=/home/ubuntu/demo.jar --logging.file=logfile.log
SuccessExitStatus=143

[Install]

WantedBy=multi-user.target

这是弹簧启动代码:

@RestController
@EnableAutoConfiguration
@SpringBootApplication
public class DemoApplication {


    @RequestMapping("/")
    String home() {
        ProcessBuilder builder = new ProcessBuilder("gedit");
        builder.redirectErrorStream(true);
        try {
            final Process process = builder.start();
            try {
                process.waitFor();


            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        return "Hello World!";
    }

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

【问题讨论】:

  • 当您从 systemd 调用时,您的 Spring 应用程序是否启动?如果您从命令行执行此操作,则使用“java -jar demo.jar”。用systemd的时候为什么不用呢?
  • 是的,spring 应用程序在这两种情况下都能正常启动,我更喜欢使用 systemd,因为“java -jar demo.jar”在我关闭终端时停止,而“nohup java -jar demo.jar”是推出几天后,资源非常匮乏。
  • 当您从 systemd 启动程序时,它们会在用户登录时执行。但它们不会附加到特定的终端或 shell。想象一下,您可以通过 GUI 或 ssh 登录。所以“gedit”不“知道”使用哪个终端,这就是它无法运行的原因。这只是我的一个假设。您是否尝试过直接从 systemd 启动 GUI 程序(即 gedit)?只是看看它是否有效。

标签: spring spring-boot ubuntu-16.04 systemd


【解决方案1】:

systemd 不适合直接自动启动 GUI 应用程序。正如@jaysee 解释的那样,它没有连接到特别的 GUI。

systemd可以做的是启动一个窗口管理器,窗口管理器可以设置为自动登录特定用户,该用户可以使用窗口管理器的“自动启动”功能来启动GUI 应用程序。

我自己也走上了同样的道路,试图专门使用 systemd,而另一条路线是我发现的。

这是 Raspberry Pi 的常见用例。因此,如果您搜索有关 [Raspberry PI autostart kiosk] 的教程,您应该会找到许多选项(无论您是否使用 Raspberry Pi)。较新的 Raspberry Pi 使用较新的基于 systemd 的 Debian 版本,因此在实践中它与您想要使用 Ubuntu 16.04 执行的操作非常相似。

【讨论】:

    猜你喜欢
    • 2015-11-17
    • 1970-01-01
    • 2020-05-11
    • 1970-01-01
    • 2020-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多