2

他の多くの人と同じように、BeagleBone Black の起動時に直接実行される Qt アプリケーションが必要です。次のような他のトピックからの回答を使用します: Beaglebone Boot to Qt App ; 組み込み Linux デバイス (Beaglebone Black) の起動時に QT アプリケーションを開始する

私は Angstrom 2012-09-12 の BeagleBone Black revC を持っています。

次のサービス設定を使用して、起動時にアプリケーションを起動することができました。

"autoShow.service"
[Unit]
Description=Autorun Qt app
ConditionFileIsExecutable=/home/root/ShowcaseNice

[Service]
Type=simple
TimeoutStartSec=120
WorkingDirectory=/home/root
ExecStart=/bin/sh -c 'source /etc/profile ; /home/root/ShowcaseNice -qws'
Restart=always

[Install]
WantedBy=multi-user.target

しかし、私のアプリケーションはタッチ スクリーン (4DCAPE-43T) を介したタッチ インターフェイスを使用していますが、まったく機能しません。systemd がアプリケーションを実行するときに tslib ライブラリがロードされていないようです。この行をサービス [Unit] に追加すると、次のようになると推測しました。

ConditionPathExists=/dev/input/touchscreen0

その後、サービスはアプリケーションをロードせず、パスが存在しないためエラー メッセージを表示します。

また、タイプをシンプルからアイドルに置き換えると、BeagleBone がアイドル モードのときにのみアプリケーションがロードされるため、ほとんどの場合、すべてのブート プロセスの最後に動作することがあります。

そのため、tslib のロードが完了した後にアプリケーションの実行を保証する方法を見つけようとしましたが、tslib をロードしているものを見つけることができませんでした (サービスではありませんか?)。では、実行する前にファイル「/dev/input/touchscreen0」が既に存在することを確認するにはどうすればよいですか?

ありがとう!

PS:環境変数の定義のために、私のプロファイルファイルが私のサービスで言及されているので、ここにあります:

# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).

PATH="/usr/local/bin:/usr/bin:/bin"
EDITOR="/bin/vi"            # needed for packages like cron
test -z "$TERM" && TERM="vt100" # Basic terminal capab. For screen etc.

if [ ! -e /etc/localtime ]; then
    TZ="UTC"        # Time Zone. Look at http://theory.uwinnipeg.ca/gnu/glibc/libc_303.html 
            # for an explanation of how to set this to your local timezone.
    export TZ
fi
if [ "$HOME" = "/home/root" ]; then
    PATH=$PATH:/usr/local/sbin:/usr/sbin:/sbin
fi
if [ "$PS1" ]; then
    # works for bash and ash (no other shells known to be in use here)
    PS1='\u@\h:\w\$ '
fi
if [ -d /etc/profile.d ]; then
    for i in /etc/profile.d/* ; do
      . $i
    done
    unset i
fi

PATH=$PATH:/opt/qt/lib
QWS_MOUSE_PROTO="LinuxInput:/dev/input/touchscreen0 MouseMan:/dev/input/mouse2"
SLOTS=/sys/devices/bone_capemgr.8/slots
PINS=/sys/kernel/debug/pinctrl/44e10800.pinmux/pins
export PATH PS1 OPIEDIR QPEDIR QTDIR EDITOR TERM QWS_MOUSE_PROTO SLOTS PINS
echo DM-GPIO-Test > $SLOTS
umask 022

EDIT1: サービスファイルを次のように変更:

"autoShow.service"
[Unit]
Description=Autorun Qt app
ConditionFileIsExecutable=/home/root/ShowcaseNice
After=systemd-modules-load.service

[Service]
Type=oneshot
WorkingDirectory=/home/root
ExecStart=/bin/sh -c 'source /etc/profile ; /home/root/ShowcaseNice -qws'
Restart=always
RemainAfterExit=1;

[Install]
WantedBy=multi-user.target

そして、アプリケーションの実行中にステータスを確認した後、次の出力が得られます (タッチ機能が動作していない場合)。

root@beaglebone:~# systemctl status systemd-modules-load.service
systemd-modules-load.service - Load Kernel Modules
      Loaded: loaded (/lib/systemd/system/systemd-modules-load.service; static)
      Active: active (exited) since Sat 2000-01-01 01:16:39 CET; 29s ago
        Docs: man:systemd-modules-load.service(8)
              man:modules-load.d(5)
     Process: 89 ExecStart=/lib/systemd/systemd-modules-load (code=exited, status=0/SUCCESS)
      CGroup: name=systemd:/system/systemd-modules-load.service
Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable.

root@beaglebone:~# systemctl status autoShow.service
autoShow.service - Autorun Qt app
      Loaded: loaded (/lib/systemd/system/autoShow.service; enabled)
      Active: activating (start) since Sat 2000-01-01 01:16:39 CET; 32s ago
    Main PID: 140 (sh)
      CGroup: name=systemd:/system/autoShow.service
          |-140 /bin/sh -c source /etc/profile ; /home/root/ShowcaseNice -qws
          `-195 /home/root/ShowcaseNice -qws
Jan 01 01:16:39 beaglebone systemd[1]: Starting Autorun Qt app...
Jan 01 01:16:45 beaglebone sh[140]: Cannot open mouse input device '/dev/input/touchscreen0': No such file or directory

root@beaglebone:~# systemctl status rc-local.service
rc-local.service
      Loaded: error (Reason: No such file or directory)
      Active: inactive (dead)

EDIT2:命題を組み合わせていくつかのテストを行った後、ほとんどの場合うまくいくと思われる中間的な解決策を見つけました。ただし、タッチ機能がまだ機能しない場合があります。私はsystemdで他の問題を抱えているので(この投稿を参照)、それを脇に置きます。

これが私のほとんど機能するサービスファイルです:

"autoShow.service"
[Unit]
Description=Autorun Qt app
ConditionFileIsExecutable=/home/root/ShowcaseNice

[Service]
After=getty@.service or getty.target
Requires=systemd-modules-load.service
WorkingDirectory=/home/root
ExecStart=/bin/sh -c 'source /etc/profile ; /home/root/ShowcaseNice -qws'
Restart=always
sysVStartPriority=99
Type=idle

[Install]
WantedBy=multi-user.target
4

1 に答える 1

1

実際に tslib をロードするものはありません。それがユーザーランドライブラリです。systemd がプログラムを起動しようとしたときにデバイスが存在しない場合は、ハードウェアのカーネル モジュールがまだロードされていない可能性があります。

After=systemd-modules-load.service

これをサービスに追加すると、静的に定義されたすべてのカーネルモジュールがロードされた後、systemd がプログラムを開始するようになります。

それでも間に合わない場合は、/etc/rc.local からプログラムを起動するか、"After=rc-local.service" (execs /etc/rc.local) を設定することを検討してください。/etc/rc.local は、デフォルトで systemd によって最後に開始されるはずです。

rc-local.service:

#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU General Public License as published by
#  the Free Software Foundation; either version 2 of the License, or
#  (at your option) any later version.

[Unit]
Description=Local customization

[Service]
ExecStart=/etc/rc.local start
TimeoutSec=0
StandardOutput=tty
RemainAfterExit=yes
SysVStartPriority=99

rc.local は実行可能である必要があります:

#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.

これは考えたこともありませんでしたが、サービスに SysVStartPriority=[1-99] を追加するだけです。これは推奨される属性ではありません (systemd.service は after または before を推奨します) が、systemd のブート プロセスのどこにあるのかを把握するよりも簡単です。起動順序を表示するためのより優れたツールが本当に必要です。

于 2014-09-18T15:00:00.803 に答える