![如何在启动时从 systemd 服务打开 GUI?](https://linux22.com/image/216091/%E5%A6%82%E4%BD%95%E5%9C%A8%E5%90%AF%E5%8A%A8%E6%97%B6%E4%BB%8E%20systemd%20%E6%9C%8D%E5%8A%A1%E6%89%93%E5%BC%80%20GUI%EF%BC%9F.png)
我正在尝试从命令行启动 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 用户服务,但您必须在您的单元中更改、删除和添加一些指令:
- 改成
WantedBy=multi-user.target
WantedBy=graphical-session.target
- 添加指令:
PartOf=graphical-session.target
和After=graphical-session.target
部分[Unit]
。 [Service]
在指令中添加:Type=exec
- 您可以删除
Environment=DISPLAY=:0
- 可能您还想在
[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
.查看这个答案更多细节。