系统服务:blob数据和返回码

时间:2017-09-28 17:59:30

标签: bash qt5 raspbian systemd

在Raspbian Stretch Lite中,我创建了以下systemd服务:

[Unit]
Description=Autostart
After=multi-user.target

[Service]
Type=forking
ExecStart=/home/pi/autostart.sh
User=pi
Group=pi

[Install]
WantedBy=multi-user.target

这里是autostart.sh的内容:

#!/bin/sh -ex

export TERM=linux
clear   
mkdir -p /home/pi/logs
/home/pi/bin/./TestApp&

脚本实际执行(我向文件添加了调试回显),但是没有启动应用程序。它是Qt5控制​​台应用程序,而不是GUI控制台应用程序。

尝试手动启动脚本(即./autostart.sh)按预期工作。 而是手动启动服务导致此输出:

$ sudo systemctl start autostart.service
$ systemctl status autostart.service
● autostart.service - Autostart
   Loaded: loaded (/lib/systemd/system/autostart.service; enabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since Thu 2017-09-28 19:56:33 CEST; 9s ago
  Process: 1351 ExecStart=/home/pi/autostart.sh (code=exited, status=0/SUCCESS)
 Main PID: 1354 (code=exited, status=127)

Sep 28 19:56:33 localhost systemd[1]: Starting Autostart...
Sep 28 19:56:33 localhost autostart.sh[1351]: + export TERM=linux
Sep 28 19:56:33 localhost autostart.sh[1351]: + clear
Sep 28 19:56:33 localhost autostart.sh[1351]: [34B blob data]
Sep 28 19:56:33 localhost systemd[1]: Started Autostart.
Sep 28 19:56:33 localhost systemd[1]: autostart.service: Main process exited, code=exited, status=127/n/a
Sep 28 19:56:33 localhost systemd[1]: autostart.service: Unit entered failed state.
Sep 28 19:56:33 localhost systemd[1]: autostart.service: Failed with result 'exit-code'.

没有执行mkdir命令(目录已经存在),但我不明白为什么不执行应用程序。

我该怎么做才能获得有关正在发生的事情的更多信息?

1 个答案:

答案 0 :(得分:1)

首先,running in the background is not the same as forking

您可以摆脱自动启动脚本并制作更简单的systemd配置文件。

  • 删除Type=forking。默认值为Type=simple,它将为您在后台运行应用程序。
  • 直接在系统配置中设置Environment="TERM=linux"
  • 您可以拥有多条ExecStart=行。添加第一个ExecStart=-/bin/mkdir -p /home/pi/logs,额外的“破折号”将允许命令“成功”,即使目录已经完成。
  • 最后,使用ExecStart=/home/pi/bin/TestApp
  • 运行您的应用

相关的手册页为man systemd.serviceman systemd.exec,或使用man systemd.directives查找任何指令。