Запустите приложение Electron при загрузке на Raspberry Pi 3 с помощью yocto - PullRequest
0 голосов
/ 15 января 2020

Я создал изображение с X11, используя yocto для Raspberry Pi 3 и сенсорный экран. Я могу запустить свое приложение, созданное с помощью Electron (chromium), запустив команды вручную в последовательном сеансе:

export DISPLAY=:0
/usr/lib/node/electron/dist/electron --no-sandbox /home/root/app

Хотя я и использую сценарий init.d, чтобы сделать это автоматически при запуске, но я бы хотел сделать это правильно. Я попытался создать файл .Xsession в своем пользовательском каталоге с помощью приведенных выше команд, но он не работает, и я не знаю, смогу ли я получить журналы того, что произошло.

Согласно это wiki , при запуске X11 много шагов. В настоящее время я вижу только терминал (от Matchbox, я думаю) и курсор мыши.

Что такое «стандартный» способ запуска приложения в системе и есть ли способ удалить курсор для сенсорного экрана?

Редактировать

Вот содержимое моего каталога /etc/X11:

  • Xsession
  • Xsession.d /
  • xinit /
  • xorg.conf

Xsession :

#!/bin/sh

if [ -x /usr/bin/dbus-launch ]; then
    # As this is the X session script, always start a new DBus session.
    eval `dbus-launch --sh-syntax --exit-with-session </dev/null`
    echo "D-BUS per-session daemon address is: $DBUS_SESSION_BUS_ADDRESS"
fi

. /etc/profile

if [ -f $HOME/.profile ]; then
    . $HOME/.profile
fi

SYSSESSIONDIR=/etc/X11/Xsession.d

export CLUTTER_DISABLE_MIPMAPPED_TEXT=1

for SESSIONFILE in $SYSSESSIONDIR/*; do
    set +e
    case "$SESSIONFILE" in
        *.sh)
            . "$SESSIONFILE"
            ;;
        *.shbg)
            "$SESSIONFILE" &
            ;;
        *~)
            # Ignore backup files
            ;;
        *)
            "$SESSIONFILE"
            ;;
    esac
    set -e
done

exit 0

xorg.con f: пусто.

Xsession.d / :

  • 13xdgbasedirs. sh
  • 30xinput_calibrate. sh
  • 89xdgautostart. sh
  • 90XWindowManager. sh

89xdgautostart. sh:

XDGAUTOSTART=/etc/xdg/autostart
if [ -d $XDGAUTOSTART ]; then
    for SCRIPT in $XDGAUTOSTART/*; do
        CMD=`grep ^Exec= $SCRIPT | cut -d '=' -f 2`
        $CMD &
    done
fi

90XWindowManager. sh:

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

Также имеется файл /etc/xserver-nodm/Xserver:

#!/bin/sh

# This script is only needed to make sure /etc/X11/xserver-common
# can affect XSERVER, ARGS & DPI: otherwise systemd could just use
# /etc/default/xserver-nodm as EnvironmentFile and sysvinit could just
# source the same file

. /etc/profile

# load default values for XSERVER, ARGS, DISPLAY...
. /etc/default/xserver-nodm

# Allow xserver-common to override ARGS, XSERVER, DPI
if [ -e /etc/X11/xserver-common ] ; then
    . /etc/X11/xserver-common
    if [ ! -e $XSERVER ] ; then
        XSERVER=$(which $XSERVER)
    fi
fi

if [ -n "$DPI" ] ; then
    ARGS="$ARGS -dpi $DPI"
fi

exec xinit /etc/X11/Xsession -- $XSERVER $DISPLAY $ARGS $*

и файл /etc/rc5.d/S09xserver-nodm:

#!/bin/sh
#
### BEGIN INIT INFO
# Provides: xserver
# Required-Start: $local_fs $remote_fs dbus
# Required-Stop: $local_fs $remote_fs
# Default-Start:     5
# Default-Stop:      0 1 2 3 6
### END INIT INFO

killproc() {            # kill the named process(es)
        pid=`/bin/pidof $1`
        [ "$pid" != "" ] && kill $pid
}

read CMDLINE < /proc/cmdline
for x in $CMDLINE; do
        case $x in
        x11=false)
        echo "X Server disabled" 
        exit 0;
                ;;
        esac
done

case "$1" in
  start)
       . /etc/profile

       #default for USER
       . /etc/default/xserver-nodm
       echo "Starting Xserver"
       if [ "$USER" != "root" ]; then
           # setting for rootless X
           chmod o+w /var/log
           chmod g+r /dev/tty[0-3]
           # hidraw device is probably needed
           if [ -e /dev/hidraw0 ]; then
               chmod o+rw /dev/hidraw*
           fi
       fi

       # Using su rather than sudo as latest 1.8.1 cause failure [YOCTO #1211]
       su -l -c '/etc/xserver-nodm/Xserver &' $USER
       # Wait for the desktop to say its finished loading
       # before loading the rest of the system
       # dbus-wait org.matchbox_project.desktop Loaded
  ;;

  stop)
        echo "Stopping XServer"
        killproc xinit
        sleep 1
        chvt 1 &
  ;;

  restart)
    $0 stop
        $0 start
  ;;

  *)
        echo "usage: $0 { start | stop | restart }"
  ;;
esac

exit 0

1 Ответ

1 голос
/ 15 января 2020

Правильный способ определения полного сеанса X зависит от вашего менеджера сеансов: от Yocto, который часто представляет собой matchbox-session или mini-x-session. Из вашего описания я бы предположил, что вы используете mini-x-session (бывает, чтобы запустить терминал и менеджер окон, если файл сессии не найден).

Цитирование mini-x- session :

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

Поэтому добавление скрипта / etc / mini_x / session должно работать.

Кстати, в вашем файле сеанса вы также можете запустить менеджер окон (X может делать странные вещи без одного):

your-app-here &
exec matchbox-window-manager
...