2017-09-28 2 views
0

In Raspbian Stretch Lite habe ich den folgenden systemd Service:Systemd Service: Blob-Daten und Rückgabecode

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

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

[Install] 
WantedBy=multi-user.target 

Hier wird der Inhalt von autostart.sh:

#!/bin/sh -ex 

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

Das Skript tatsächlich ausgeführt wird (Ich habe ein Debug-Echo zu einer Datei hinzugefügt, aber die Anwendung wird nicht gestartet. Es ist eine Qt5-Konsolenanwendung, keine grafische Benutzeroberfläche.

Der Versuch, das Skript manuell zu starten (d. H. ./autostart.sh) funktioniert wie erwartet. Stattdessen manuell starten, der Dienst an diesen Ausgang führt:

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

Es ist in Ordnung, der mkdir Befehl nicht ausgeführt wird (das Verzeichnis bereits vorhanden ist), aber ich verstehe nicht, warum Anwendung nicht ausgeführt wird.

Was könnte ich tun, um mehr Informationen über das, was passiert, zu erhalten?

Antwort

1

Zuerst running in the background is not the same as forking.

Sie können von Ihrem Autostart-Skript loszuwerden und eine einfachere systemd Config-Datei machen.

  • entfernen Type=forking. Der Standardwert ist Type=simple, mit dem Sie Ihre App im Hintergrund für Sie ausführen können.
  • Environment="TERM=linux" direkt in der Systemkonfiguration einstellen. Sie können mehrere ExecStart= Zeilen haben. Fügen Sie eine erste hinzu, die ExecStart=-/bin/mkdir -p /home/pi/logs ist, der zusätzliche "Strich" dort wird dem Befehl erlauben, 'erfolgreich' zu sein, sogar wenn das Verzeichnis bereits gemacht worden ist.
  • Schließlich führen Sie Ihre Anwendung mit ExecStart=/home/pi/bin/TestApp

Verwandte Mann Seiten sind man systemd.service, man systemd.exec oder jede Richtlinie mit man systemd.directives nachschlagen.

+0

Dort heißt es: „autostart.service: Service verfügt über mehr als eine ExecStart = Einstellung, die nur für Typ = oneshot Dienste erlaubt verweigert..“. Wie auch immer, ich löste das Verschieben des 'mkdir'-Befehls in einem anderen Skript, das früher ausgeführt wurde. – Mark