Ubuntu

正確執行 systemd 服務文件的問題

  • August 20, 2020

我有一個 GUI 程序,我可以從終端毫無問題地執行:

$ /home/user1/ibg/ibg username=*** password=***

使用上面的命令,程序GUI顯示出來,自動登錄到我的線上帳戶,我可以使用python腳本通過埠4002與他們的伺服器通信並成功請求數據。沒有任何問題。

我想systemd在 ubuntu 中為上述命令創建一個服務。我寫的服務文件如下(放在 中/etc/systemd/system):

[Unit]
Description=ibg service
After=network.target

[Service]
Type=simple
Environment=DISPLAY=:0
ExecStart=/home/user1/ibg/ibg username=**** password=****

[Install]
WantedBy=multi-user.target

但是,該服務無法成功執行。

user1@SFO:~$ sudo systemctl status ibg.service
● ibg.service - ibg service
  Loaded: loaded (/etc/systemd/system/ibg.service; enabled; vendor preset: enabled)
  Active: failed (Result: exit-code) since Tue 2020-08-18 22:13:07 PDT; 3s ago
 Process: 27951 ExecStart=/home/user1/ibg/ibg username=**** password=**** (code=exited, status=1/FAILURE)
Main PID: 27951 (code=exited, status=1/FAILURE)

Aug 18 22:13:07 SFO ibg[27951]:         at java.security.AccessController.doPrivileged(Native Method)
Aug 18 22:13:07 SFO ibg[27951]:         at java.awt.Toolkit.getDefaultToolkit(Toolkit.java:854)
Aug 18 22:13:07 SFO ibg[27951]:         at java.awt.Toolkit.getEventQueue(Toolkit.java:1734)
Aug 18 22:13:07 SFO ibg[27951]:         at java.awt.EventQueue.invokeLater(EventQueue.java:1266)
Aug 18 22:13:07 SFO ibg[27951]:         at com.exe4j.runtime.LauncherEngine.handleFailure(LauncherEngine.java:140)
Aug 18 22:13:07 SFO ibg[27951]:         at com.exe4j.runtime.LauncherEngine.launch(LauncherEngine.java:94)
Aug 18 22:13:07 SFO ibg[27951]:         at com.install4j.runtime.launcher.UnixLauncher.start(UnixLauncher.java:66)
Aug 18 22:13:07 SFO ibg[27951]:         at install4j.ibg.GWClient.main(Unknown Source)
Aug 18 22:13:07 SFO systemd[1]: ibg.service: Main process exited, code=exited, status=1/FAILURE
Aug 18 22:13:07 SFO systemd[1]: ibg.service: Failed with result 'exit-code'.

有人可以幫我找出問題所在嗎?status 命令沒有提供服務無法執行的原因。有沒有辦法獲得有關失敗的更多資訊?使用我創建的服務執行 GUI 的命令行版本有什麼區別?我正在使用完全相同的命令來執行它ExecStart

由於它是一個圖形應用程序,我懷疑這個答案可能會對您有所幫助:

在 systemd 服務文件中設置 DISPLAY

您的服務文件在執行圖形應用程序時存在一些問題。

如果要將其保留為系統服務:

  • WantedBy=multi-user.target。我建議更改為WantedBy=graphical.target並且After=graphical.target僅在您的顯示管理器啟動後才會發生。但是,它可能仍然是一個問題,因為它可能會在您登錄之前嘗試(並且失敗)啟動應用程序。
  • 它執行為root. 您可能想User=在服務部分設置
  • 添加Environment=DISPLAY=:0Environment=XAUTHORITY=/home/username/.Xauthority

作為使用者服務,它可能會更好地工作:

  • 搬到*.service_~/.config/systemd/user/
  • 更改WantedBy=WantedBy=default.target

一旦它成為使用者服務,使用 啟用它systemctl --user enable ibg.service或使用 啟動它systemctl --user start ibg.service

引用自:https://unix.stackexchange.com/questions/605203