システムを起動するたびに 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: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デスクトップに正しく表示される場合。これは、ユーザーが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
ディレクティブを追加する必要があります。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