시스템을 부팅할 때마다 루트로 스크립트를 실행하고 싶습니다. 나는 쉘 스크립트를 작성했습니다:
# 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:1
s를 시도했지만 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
지시문을 추가해야 합니다 . After
Weston 신디사이저가 필요하므로 이를 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