web-dev-qa-db-ja.com

組み込みLinuxの起動時にQtアプリケーションを起動する

起動直後にQtアプリケーションを起動しようとしています。起動すると、LinuxイメージはXサーバーとターミナルを起動するだけです。また、バックグラウンドでcronデーモンが実行されています。明らかに、私のQtアプリケーションでは、Xサーバーを実行して何かを実行する必要があります。

Red HatとSUSE Linuxの 同様の質問 を見てきました。

しかし、私はこれが私の画像に対して機能するとは思わない。

Xサーバーの直後にGUIアプリケーションを起動する標準的な方法がLinux/UNIXにあるかどうか疑問に思っています。


[sj755@localhost X11]$ tree /etc/X11/
/etc/X11/
|-- functions
|-- Xdefaults
|-- Xinit
|-- Xinit.d
|   |-- 01xrandr
|   |-- 11zaurus
|   |-- 12keymap
|   |-- 40xmodmap
|   |-- 50setdpi
|   |-- 55xScreenSaver
|   |-- 60xXDefaults
|   |-- 89xTs_Calibrate
|   `-- 98keymap-fixup
|-- xmodmap
|   |-- a716.xmodmap
|   |-- collie.xmodmap
|   |-- default.xmodmap
|   |-- h1910.xmodmap
|   |-- h2200.xmodmap
|   |-- h6300.xmodmap
|   |-- hx4700.xmodmap
|   |-- keyboardless.xmodmap
|   |-- omap5912osk.xmodmap
|   |-- poodle.xmodmap
|   |-- shepherd.xmodmap
|   |-- simpad.xmodmap
|   |-- slcXXXX.xmodmap
|   |-- xmodmap-invert
|   |-- xmodmap-left
|   |-- xmodmap-portrait
|   `-- xmodmap-right
|-- xorg.conf
|-- Xserver
|-- xserver-common
|-- Xsession
`-- Xsession.d
    |-- 60xXDefaults
    |-- 89xdgautostart
    `-- 90xXWindowManager

3 directories, 36 files

root@devboard:~# cat /etc/X11/Xsession.d/90xXWindowManager
if [ -x $HOME/.Xsession ]; then
    exec $HOME/.Xsession
Elif [ -x /usr/bin/x-session-manager ]; then
    exec /usr/bin/x-session-manager
else
    exec /usr/bin/x-window-manager
fi

#!/bin/sh
#
# Very simple session manager for Mini X
#

# Uncomment below to enable parsing of debian menu entrys
# export MB_USE_DEB_MENUS=1 

if [ -e $HOME/.mini_x/session ]
then
exec $HOME/.mini_x/session
fi

if [ -e /etc/mini_x/session ]
then
exec /etc/mini_x/session
fi

MINI_X_SESSION_DIR=/etc/mini_x/session.d
if [ -d "$MINI_X_SESSION_DIR" ]; then
    # Execute session file on behalf of file owner
    find $MINI_X_SESSION_DIR -type f | while read SESSIONFILE; do
        set +e
        USERNAME=`stat -c %U $SESSIONFILE`
        # Using su rather than Sudo as latest 1.8.1 cause failure [YOCTO #1211]
#       su -l -c '$SESSIONFILE&' $USERNAME
        Sudo -b -i -u $USERNAME $SESSIONFILE&
        set -e
    done
fi

# This resolution is big enough for hob2's max window size.
xrandr -s 1024x768

# Default files to run if $HOME/.mini_x/session or /etc/mini_x/session
# don't exist. 

matchbox-terminal&
exec matchbox-window-manager
5
sj755

/etc/X11/xinit/xinitrc(これはシステムによって場所が異なる場合があります)を調べて、どのファイルをソースにするかを確認してください。通常、これはif..Elif..else構造を持つため、$HOME/.Xclientsが優先され、/etc/X11/xinit/Xclientsが指定された初期化ファイルが1つだけ読み取られます。表示される端末の出所はほぼ確実です(デスクトップ環境がインストールされていないなどと思います)。

とにかく、単一のGUIアプリを実行するだけの場合は、次のようにXclientsファイルを作成(または変更)します。

#!/bin/sh

myGUIapp

これは実行可能でなければなりません。 GUIアプリをバックグラウンド化しないとその時点で実行がブロックされることは明らかですが、これは通常のシェルスクリプトだと思います。

[後で追加]

インストールにはこれらのファイルは正確にはありませんが、/etc/X11/Xinit.dはあります。見れば、これらは短いシェルスクリプトであり、どこかからソースされていると思います。おそらく/etc/X11-XsessionXserver、またはxserver-common。環境で$XINITRCが定義されているかどうかを確認する必要がある場合があります。それが手掛かりになります。

おそらく、$HOME/.Xclientsファイルを作成する(または、jofelが言及しているように、$HOME/.xinitrcのほうが一般的です)と試してみてください-まさにそのスペルと大文字小文字を区別します。先頭にドットを付け、chmod 755を設定する必要があります(グループと他の権限mayは問題ではありません)。ほとんど間違いなく、これはどこかから適切に供給されます。

自分でファイルを/etc/X11/Xinit.dに配置することはできますが、この目的のためにファイルを最後に実行し、それ以上の実行をブロックする必要があるため、これを行うことはお勧めできません。そのため、/etc/X11のスクリプトを確認し(ここでもXsessionなど、.shサフィックスがありません)、すべてがどの順序でチェーンされているかを調べてみてください。また、それらのどこかがXclientsファイルをチェックしている可能性もあります。

if [ -x /some/path/Xclients ]; then

$HOME.xinitrcも使用できます。これが、これらのバリエーションの少なくとも1つを作成することが機能する理由です(最初に成功しなかった場合は、ファイルを作成して移動/名前を変更してください)。要約すると、名前の主要候補:.xinitrxまたは.Xclients$HOMEおよび/etc/X11/ですが、後者の場合は、先頭のドットを破棄します。

3
goldilocks

Xサーバーを起動するユーザーの$HOME/.xinitrcにコマンドを追加できます。

実行可能ファイル$HOME/.xinitrcシェルスクリプトである必要があります(最初の行#!/bin/shおよびchmod +x $HOME/.xinitrc)。

1
jofel

第一に、「私のQtアプリケーションは何かを実行するためにXサーバーが実行されている必要があります "-linuxfbバックエンドをupstart。そうすることができれば、Xを経由するよりも起動が速くなり、メモリ使用量が少なくなります。一方、X11クライアントプログラムを起動したり、ウィンドウマネージャーが必要になったりして、誰もが使えるわけではありません。

今のところアプリケーションにXサーバーが必要であると仮定して、nodmディスプレイマネージャーを確認します。これは組み込みアプリケーション用に設計されています。 MythTVフロントエンドに使用します。 /etc/X11/のスクリプトをいじるよりもはるかにクリーンで、ユーザーごとに異なる設定を行うことができます。これは、開発中に便利な場合があります。

使い方はとても簡単です。 Debianインストールでは、/etc/default/nodmを編集してnodmを有効にし、必要なユーザー名を指定します。他のデフォルトはおそらく大丈夫です。

次に、そのユーザーに適切な~/.xinitrcを指定します。最も単純なケースでは、アプリケーションへのシンボリックリンクにすることができます。ただし、背景を設定したり、キーマップをインストールしたり、スクリーンセーバーを起動したり、/bin/shの前に気に入るその他の便利な機能を備えた短いexec myapplicationスクリプトである可能性が高くなります。

ヒント-作業中に最後の行をexec xtermに置き換えてください。これは、物事を試すのに非常に役立ちます。

1
Toby Speight