如何在启动时从 systemd 服务打开 GUI?

如何在启动时从 systemd 服务打开 GUI?

我正在尝试从命令行启动 VMWare Workstation 虚拟机。我可以root通过运行以下命令在我的用户(而不是)下执行此操作

/usr/bin/vmplayer /home/myUser/vmware/myVm.vmx

现在,我想将此虚拟机设置为在启动时启动,因此我创建了一个 /lib/systemd/system/myService.service具有以下内容的服务:

[Unit]
Description=my vm service

[Service]
User=myUser
ExecStart=/usr/bin/vmplayer /home/myuser/vmware/myVm.vmx
Environment=DISPLAY=:0

[Install]
WantedBy=multi-user.target

如果我从终端(即sudo systemctl restart myService)运行该服务,我可以看到虚拟机窗口弹出并正确启动。但是,如果我重新启动系统,虚拟机不会启动,这就是status我得到的

Jan 23 12:55:59 home systemd[1]: Started myService service.
Jan 23 12:56:00 home truenas.sh[848]: [AppLoader] Use shipped Linux kernel AIO access library.
Jan 23 12:56:00 home truenas.sh[848]: An up-to-date "libaio" or "libaio1" package from your system is preferred.
Jan 23 12:56:00 home vmplayer[848]: cannot open display: :0
Jan 23 12:56:00 home systemd[1]: myService.service: Main process exited, code=exited, status=1/FAILURE
Jan 23 12:56:00 home systemd[1]: myService.service: Failed with result 'exit-code'.

我认为DISPLAY=:0环境可以解决问题,但这就是我遇到的错误,我无法解决它。

答案1

正如 @Stephen Boston 在评论中指出的那样,您应该使用 systemd 用户服务,但您必须在您的单元中更改、删除和添加一些指令:

  1. 改成WantedBy=multi-user.targetWantedBy=graphical-session.target
  2. 添加指令:PartOf=graphical-session.targetAfter=graphical-session.target部分[Unit]
  3. [Service]在指令中添加:Type=exec
  4. 您可以删除Environment=DISPLAY=:0
  5. 可能您还想在[Service]部分中添加此指令:Restart=no

所以你的单位将变成:

[Unit]
Description=my vm service
PartOf=graphical-session.target
After=graphical-session.target

[Service]
Type=exec
Restart=no
ExecStart=/usr/bin/vmplayer /home/myuser/vmware/myVm.vmx

[Install]
WantedBy=graphical-session.target

最后将单元放在:$HOME/.config/systemd/user/目录下并启用/启动它,您应该使用systemctl --user ....

systemctl --user enable myService.service

systemctl --user start myService.service

您还可以使用.desktop文件在 StartUp 上运行应用程序,并将它们放置在/etc/xdg/autostart~/.config/autostart.查看这个答案更多细节。

相关内容