시스템 서비스 파일을 올바르게 실행하는 데 문제가 있습니다.

시스템 서비스 파일을 올바르게 실행하는 데 문제가 있습니다.

다음 명령을 사용하면 문제 없이 터미널에서 실행할 수 있는 GUI 프로그램이 있습니다.

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

위의 명령을 사용하면 프로그램 GUI가 나타나고 내 온라인 계정에 자동으로 로그인되며 Python 스크립트를 사용하여 포트 4002를 통해 서버와 통신하고 데이터를 성공적으로 요청할 수 있습니다. 문제 없습니다.

systemd위 명령에 대해 우분투에서 서비스를 만들고 싶습니다 . 제가 작성한 서비스 파일은 다음과 같습니다( 에 넣음 /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'.

누구든지 문제를 파악하는 방법을 도와줄 수 있나요? 상태 명령은 서비스를 실행할 수 없는 이유를 제공하지 않습니다. 실패에 대한 추가 정보를 얻을 수 있는 방법이 있습니까? 명령줄 버전의 GUI와 내가 만든 서비스를 실행하는 것의 차이점은 무엇입니까? 나는 그것을 실행하기 위해 똑같은 명령을 사용하고 있습니다 ExecStart.

답변1

그래픽 응용 프로그램이므로 이 답변이 도움이 될 것으로 생각됩니다.

systemd 서비스 파일에 DISPLAY 설정

서비스 파일이 그래픽 애플리케이션을 실행하는 경우 몇 가지 문제가 발생합니다.

시스템 서비스로 유지하려면 다음을 수행하세요.

  • 그것은 WantedBy=multi-user.target. WantedBy=graphical.target및 로 변경하는 것이 좋습니다 . After=graphical.target이는 디스플레이 관리자가 시작된 후에만 발생할 수 있습니다. 그러나 로그인하기 전에 애플리케이션을 실행하려고 시도하거나 실패할 수 있으므로 여전히 문제가 될 수 있습니다.
  • 로 실행됩니다 . 서비스 섹션에서 이를 설정 root해야 할 수도 있습니다.User=
  • Environment=DISPLAY=:0및 를 추가합니다 Environment=XAUTHORITY=/home/username/.Xauthority.

사용자 서비스로 더 잘 작동할 수 있습니다.

  • *.service이동하다~/.config/systemd/user/
  • WantedBy=로 변경WantedBy=default.target

사용자 서비스가 되면 를 사용하여 활성화 systemctl --user enable ibg.service하거나 를 사용하여 시작합니다 systemctl --user start ibg.service.

관련 정보