起動時にシステムサービスでGUIを開く方法は?

起動時にシステムサービスで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がコメントで指摘したように、システムユーザーサービスを使用する必要がありますが、ユニット内のいくつかのディレクティブを変更、削除、および追加する必要があります。

  1. WantedBy=multi-user.targetに変更WantedBy=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この回答詳細については。

関連情報