和其他人一样,我希望有一个Qt应用程序在BeagleBone Black启动时直接运行。使用以下其他主题的答案: Beaglebone Boot to Qt App; Start QT Application on bootup on an Embedded Linux Device (Beaglebone Black)
我与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库。我推断,因为当我将这一行添加到服务[单位]时:
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(see this post)时遇到其他麻烦,我把它放在一边。
这是我几乎正在使用的服务文件:
"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
答案 0 :(得分: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建议之后或之前),但它比确定systemd中启动过程中的位置更容易。他们确实需要更好的工具来显示启动顺序。