Как и многие другие люди, я хочу, чтобы приложение Qt запускалось непосредственно при загрузке BeagleBone Black. Используя ответы из других тем, например: Beaglebone Boot to Qt App ; Запуск приложения QT при загрузке на встроенном Устройство Linux (Beaglebone Black)
У меня есть BeagleBone Black revC с Angstrom 2012-09-12.
Мне удалось запустить приложение при загрузке со следующей настройкой службы:
"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) и оно вообще не работает. Кажется, что библиотека tslib не загружается, когда systemd запускает мое приложение. Я сделал такой вывод, потому что когда я добавляю эту строку в сервис [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)
РЕДАКТИРОВАТЬ 2: После нескольких тестов, объединяющих предложение, я нашел промежуточное решение, которое, похоже, работает большую часть времени. Но иногда сенсорные возможности все еще не работают. Поскольку у меня возникают другие проблемы с systemd (см. этот пост), Я положил это сбоку.
Вот мой почти рабочий служебный файл:
"autoShow.service"
[Unit]
Description=Autorun Qt app
ConditionFileIsExecutable=/home/root/ShowcaseNice
[Service]
[email protected] 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