Search code examples
bashqt5raspbiansystemd

Systemd service: blob data and return code


In Raspbian Stretch Lite I created the following systemd service:

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

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

[Install]
WantedBy=multi-user.target

Here the content of autostart.sh:

#!/bin/sh -ex

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

The script is actually executed (I added a debug echo to a file) but the application is not launched. It's a Qt5 console application, not a GUI one.

Trying to manually launch the script (i.e. ./autostart.sh) works as expected. Instead, manually start the service leads to this output:

$ 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'.

It's ok the mkdir command is not executed (the directory is already there), but I don't understand why application is not executed.

What could I do to get more information about what's happening?


Solution

  • First, running in the background is not the same as forking.

    You can get rid of your autostart script and make a simpler systemd config file.

    • remove Type=forking. The default is Type=simple, which will handle running your app in the background for you.
    • Set Environment="TERM=linux" directly in the system configuration.
    • You can have multiple ExecStart= lines. Add a first one that is ExecStart=-/bin/mkdir -p /home/pi/logs, the extra "dash" there will allow the command to 'succeed' even if the directory has already been made.
    • Finally, run your app with ExecStart=/home/pi/bin/TestApp

    Related man pages are man systemd.service, man systemd.exec, or look up any directive with man systemd.directives.