systemd 스크립트를 사용하여 응용 프로그램이 시작되지 않는 이유

systemd 스크립트를 사용하여 응용 프로그램이 시작되지 않는 이유

시스템을 부팅할 때마다 루트로 스크립트를 실행하고 싶습니다. 나는 쉘 스크립트를 작성했습니다:

# cat /home/root/demo_wrap.sh 
#!/bin/bash
`/home/root/demo_start.sh` > /dev/null &

쉘에서 호출하면 잘 작동합니다. 나는 다음 서비스 파일을 작성했습니다:(Edgar Magallon의 의견을 바탕으로 업데이트되었습니다.):

# cat /etc/systemd/system/demo_start.service 
[Unit]
Description=starts the MH11 demo on EVK

[Service]
Environment="DISPLAY=:0"
Type=forking
XAUTHORITY=/home/root/.Xauthority
ExecStart=/home/root/demo_wrap.sh

[Install]
WantedBy=graphical.target

(저도 DISPLAY:1s를 시도했지만 XAUTHORITY=/run/user/0성공하지 못했습니다)

그러나 어떤 이유로 # systemctl start demo_start애플리케이션이 호출되지 않고 보고됩니다.

[[0;1;31m*[[0m demo_start.service - starts the MH11 demo on EVK
     Loaded: loaded (/etc/systemd/system/demo_start.service; enabled; vendor preset: disabled)
     Active: [[0;1;31mfailed[[0m (Result: exit-code) since Wed 2022-05-11 18:58:25 UTC; 1min 11s ago
    Process: 251 ExecStart=/home/root/demo_wrap.sh (code=exited, status=0/SUCCESS)
   Main PID: 252 (code=exited, status=127)

May 11 18:58:18 smarc-rzv2l systemd[1]: Starting starts the MH11 demo on EVK...
May 11 18:58:18 smarc-rzv2l systemd[1]: Started starts the MH11 demo on EVK.
May 11 18:58:25 smarc-rzv2l demo_wrap.sh[254]: error: XDG_RUNTIME_DIR not set in the environment.
May 11 18:58:25 smarc-rzv2l demo_wrap.sh[254]: Connecting to display server failed!: No such file or directory
May 11 18:58:25 smarc-rzv2l demo_wrap.sh[254]: [ERROR] Wayland::init failed
May 11 18:58:25 smarc-rzv2l demo_wrap.sh[252]: /home/root/demo_wrap.sh: line 2: RZ/V2L: No such file or directory
May 11 18:58:25 smarc-rzv2l systemd[1]: [[0;1;39m[[0;1;31m[[0;1;39mdemo_start.service: Main process exited, code=exited, status=127/n/a[[0m
May 11 18:58:25 smarc-rzv2l systemd[1]: [[0;1;38;5;185m[[0;1;39m[[0;1;38;5;185mdemo_start.service: Failed with result 'exit-code'.[[0m 

그리고 export XDG_RUNTIME_DIR="/run/user/0"다음과 같이 설정합니다 /etc/profile.

export XDG_RUNTIME_DIR=/run/user/$UID

웨스턴 디스플레이 관리자가 시작되고 HDMI 화면에 올바르게 표시됩니다.

환경:

이것은 Weston 신디사이저를 실행하는 Yocto 내장 배포판이 있는 임베디드 플랫폼에 있습니다. Weston에서 쉘 창을 실행하고 를 입력하면 echo $DISPLAY예상한 내용이 인쇄되지 않습니다 :0( :1아래 Edgar Magallon에 따르면). 터미널 창이 Weston 데스크탑에 올바르게 표시되는 경우. 이는 사용자가 단 한 명뿐인 내장형 참조 플랫폼입니다 root. 네트워크에 연결되어 있지 않으며 다른 하드웨어 수단을 연결하여 누구도 액세스할 수 없습니다. 안전은 문제가 되지 않습니다!

내 시스템에서 다음을 발견했습니다.

# cat /lib/systemd/system/weston\@.service 
[Unit]
Description=Weston Wayland Compositor
RequiresMountsFor=/run
Conflicts=plymouth-quit.service
After=systemd-user-sessions.service plymouth-quit-wait.service

[Service]
User=%i
PAMName=login
EnvironmentFile=-/etc/default/weston
StandardError=journal
PermissionsStartOnly=true
IgnoreSIGPIPE=no

ExecStart=/usr/bin/weston-start -v -e -- $OPTARGS

내 데모는 이 후에 시작되어야 하는데 좀 이상합니다. # systemctl status weston.service보여주세요:

[[0;1;32m*[[0m weston.service
     Loaded: loaded (/etc/init.d/weston; generated)
     Active: [[0;1;32mactive (exited)[[0m since Wed 2022-05-11 18:57:23 UTC; 33min ago
       Docs: man:systemd-sysv-generator(8)
    Process: 189 ExecStart=/etc/init.d/weston start (code=exited, status=0/SUCCESS)

May 11 18:57:22 smarc-rzv2l systemd[1]: Starting weston.service...
May 11 18:57:23 smarc-rzv2l systemd[1]: Started weston.service.
May 11 18:57:34 smarc-rzv2l weston[196]: Connecting to display server failed!: No such file or directory
May 11 18:57:34 smarc-rzv2l weston[196]: [ERROR] Wayland::init failed
May 11 18:57:35 smarc-rzv2l weston[190]: /etc/profile.d/zz1-demo_wrap.sh: line 2: RZ/V2L: No such file or directory

그리고 Weston은 잘 운영되고 있습니다.

답변1

무슨 일이 일어나고 있는지는 다른 서비스가 시작되기 전에 서비스 파일이 애플리케이션을 실행하려고 시도한다는 것입니다. 다른 서비스가 이미 실행 중일 때만 서비스가 실행되도록 지시하는 demo_start.service지시문을 추가해야 합니다 . AfterWeston 신디사이저가 필요하므로 이를 weston.service지시문에 추가해야 합니다.

또한 XDG_RUNTIME_DIR오류의 경우에도 동일한 논리가 적용됩니다. 이 경우 /run/user/0애플리케이션을 실행하기 전에 디렉터리가 생성되도록 systemd-user-sessions.service를 추가해야 합니다 . 이 외에도 지시어를 Environment디렉터리 경로로 설정해야 합니다 XDG_RUNTIME_DIR.

파일 demo_start.service에는 다음 지시문이 포함되어야 합니다.

[Unit]
Description = starts the MH11 demo on EVK
After = weston.service systemd-user-sessions.service

[Service]
User = root
Environment = "XDG_RUNTIME_DIR=/run/user/0"
ExecStart = /home/root/demo_wrap.sh

[Install]
WantedBy = multi-user.target

관련 정보