我有一个 C++ 应用程序,可以手动运行,但在由 systemd 服务运行时失败且没有错误消息。为什么会出现这种情况?
我自己就可以运行该程序:
$ DISPLAY=:0 /home/pi/myApp/myApp &
但是当我通过 systemd 服务执行此操作时,它不会启动。执行链是:
kiosk.service -> kiosk.sh -> myApp
这是我的 systemd 服务(kiosk.service):
[Unit]
Description=Run app in kiosk mode
Wants=graphical.target
After=graphical.target
[Service]
ExecStartPre=/bin/sleep 20
Environment=DISPLAY=:0.0
Environment=XAUTHORITY=/home/pi/.Xauthority
Type=simple
ExecStart=/bin/bash /home/pi/kiosk.sh
Restart=on-abort
User=pi
Group=pi
[Install]
WantedBy=graphical.target
这是运行我的应用程序的 kiosk.sh:
#!/bin/bash
# This script has been adapted from: https://pimylifeup.com/raspberry-pi-kiosk/
# Disable screensaver / blank screen due to inactivity
xset s noblank
xset s off
xset -dpms
# Hide mouse cursor using the unclutter program
DISPLAY=:0 unclutter -idle 0.5 -root &
# Launch of app with our params
DISPLAY=:0 /home/pi/myApp/myApp &
$ systemctl status kiosk.service
说:
○ kiosk.service - Launch app in kiosk mode
Loaded: loaded (/lib/systemd/system/kiosk.service; enabled; preset: enabled)
Active: inactive (dead) since Wed 2023-12-27 19:10:13 EST; 5min ago
Duration: 48ms
Main PID: 1483 (code=exited, status=0/SUCCESS)
CPU: 54ms
Dec 27 19:09:53 raspberrypi systemd[1]: Starting kiosk.service - Launch app in kiosk mode...
Dec 27 19:10:13 raspberrypi systemd[1]: Started kiosk.service - Launch app in kiosk mode.
Dec 27 19:10:13 raspberrypi systemd[1]: kiosk.service: Deactivated successfully.
如果我这样做了
$ sh /home/pi/kiosk.sh
它也运行得很好,所以我的shell启动器脚本似乎没有任何问题。
我在想当从 systemd 服务执行程序时,某些环境变量上下文会发生变化?有什么想法吗?
无需在后台运行应用程序。所有 systemd 服务都作为守护进程运行。所以删除
&
之后的 MyApp
。
您的应用程序显然依赖于不在标准位置的库,您需要设置
LD_LIBRARY_PATH
环境变量。所以添加
Environment="LD_LIBRARY_PATH=/home/pi/myApp/libs:/usr/local/lib:/usr/lib:/lib"
前往
[Service]
部分。