无法从 systemd 服务启动 GUI 程序
Cannot launch GUI programs from systemd service
我有一个 Spring 启动应用程序,我通过 Ubuntu 中的 systemd 服务执行它,在使用 sudo startkde
启动 X 服务器后,我无法从该应用程序启动 GUI 程序同时使用像 gedit
这样的命令行,当我使用 sudo java -jar demo.jar
启动应用程序时它可以工作,我尝试将 gedit
命令放在 shell 脚本中,但问题仍然存在。
是否有任何解决方案来使用该服务并启动 GUI 程序,或者使用可以解决问题的另一种服务启动 spring 启动。
这是 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
这是 spring 引导代码:
@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
不适合直接自动启动 GUI 应用程序。正如@jaysee 所解释的,它没有连接到特定的 GUI。
systemd 可以做的是启动一个window-管理器,window管理器可以设置为自动登录特定用户,并且用户可以使用 window 管理器的 "autostart" 功能来启动 GUI 应用程序。
我自己尝试使用 systemd 时走的是同一条路,而我发现另一条路可行。
这是 Raspberry Pi 的常见用例。因此,如果您搜索有关 [Raspberry PI autostart kiosk] 的教程,您应该会找到许多选项(无论您是否使用 Raspberry Pi)。较新的 Raspberry Pis 使用较新的基于 systemd 的 Debian 版本,因此在实践中它与您想对 Ubuntu 16.04.
执行的操作非常相似
我有一个 Spring 启动应用程序,我通过 Ubuntu 中的 systemd 服务执行它,在使用 sudo startkde
启动 X 服务器后,我无法从该应用程序启动 GUI 程序同时使用像 gedit
这样的命令行,当我使用 sudo java -jar demo.jar
启动应用程序时它可以工作,我尝试将 gedit
命令放在 shell 脚本中,但问题仍然存在。
是否有任何解决方案来使用该服务并启动 GUI 程序,或者使用可以解决问题的另一种服务启动 spring 启动。
这是 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
这是 spring 引导代码:
@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
不适合直接自动启动 GUI 应用程序。正如@jaysee 所解释的,它没有连接到特定的 GUI。
systemd 可以做的是启动一个window-管理器,window管理器可以设置为自动登录特定用户,并且用户可以使用 window 管理器的 "autostart" 功能来启动 GUI 应用程序。
我自己尝试使用 systemd 时走的是同一条路,而我发现另一条路可行。
这是 Raspberry Pi 的常见用例。因此,如果您搜索有关 [Raspberry PI autostart kiosk] 的教程,您应该会找到许多选项(无论您是否使用 Raspberry Pi)。较新的 Raspberry Pis 使用较新的基于 systemd 的 Debian 版本,因此在实践中它与您想对 Ubuntu 16.04.
执行的操作非常相似