systemdスクリプトを使用してアプリケーションが起動しない理由

systemdスクリプトを使用してアプリケーションが起動しない理由

システムを起動するたびに root でスクリプトを実行したいと思います。私はシェルスクリプトを書いた:

# 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デスクトップに正しく表示される場合。これは、ユーザーが1人だけの組み込み参照プラットフォームです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

そしてウェストンはよく運営されています。

答え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

関連情報