Systemd wirft Fehlermeldung (code=exited, status=1/FAILURE) wenn Serveranwendung einen Fehlercode zurückmeldet

Einrichten des lokalen Netzes, Verbindung zu anderen Computern und Diensten.
Antworten
Cordess
Beiträge: 422
Registriert: 09.01.2006 00:37:22

Systemd wirft Fehlermeldung (code=exited, status=1/FAILURE) wenn Serveranwendung einen Fehlercode zurückmeldet

Beitrag von Cordess » 12.11.2021 19:57:14

Ich habe mir für den tigervncserver Server folgende systemd unit Datei erstellt:

Code: Alles auswählen

[Unit]
Description=Remote desktop service (VNC)
After=network.target

[Service]
## --- Variante 1 ---
## Original
## Geht, aber Desktop liefert PopUp Fenster mit Meldung  "No session for pid ####" 
##  pid zeigt auf  #### ?        00:00:00 lxpolkit
#Type=forking

#ExecStart=/usr/libexec/tigervncsession-start %i
#PIDFile=/run/tigervncsession-%i.pid
#SELinuxContext=system_u:system_r:vnc_session_t:s0

## --- Variante 3 ---
## Neu geht, aber nur für Nutzer pi. Damit funktioniert aber auch der Raspi Desktop
Type=simple
#ExecStartPre=/sbin/runuser -l pi -c "/usr/bin/tigervncserver -kill %i > /dev/null 2>&1"
ExecStartPre=/sbin/runuser -l pi -c "/usr/bin/tigervncserver -kill %i"
ExecStart=/sbin/runuser -l pi -c "/usr/bin/tigervncserver  %i"
#ExecStop=/sbin/runuser -l pi -c "/usr/bin/tigervncserver -kill %i"

# Nach dem beenden der Sitzung soll der Dienst neu gestartet werden:
Restart=on-success
RestartSec=10

[Install]
WantedBy=multi-user.target
Das Problem ist hierbei, dass nach Ausführung der ExecStartPre Bedingung folgender Fehlercode zurückgeliefert wird,
falls noch keine tigervncsitzung lief, eine vorherige Serversession also bspw. beendet wurde.

Code: Alles auswählen

sudo systemctl status tigervncserver@\:1.service 
● tigervncserver@:1.service - Remote desktop service (VNC)
     Loaded: loaded (/etc/systemd/system/tigervncserver@.service; enabled; vendor preset: enabled)
     Active: failed (Result: exit-code) since Fri 2021-11-12 19:38:29 CET; 14s ago
    Process: 17506 ExecStartPre=/sbin/runuser -l pi -c /usr/bin/tigervncserver -kill :1 (code=exited, status=1/FAILURE)
        CPU: 29ms

Nov 12 19:38:28 raspberrypi systemd[1]: Starting Remote desktop service (VNC)...
Nov 12 19:38:29 raspberrypi systemd[1]: tigervncserver@:1.service: Control process exited, code=exited, status=1/FAILURE
Nov 12 19:38:29 raspberrypi systemd[1]: tigervncserver@:1.service: Failed with result 'exit-code'.
Nov 12 19:38:29 raspberrypi systemd[1]: Failed to start Remote desktop service (VNC).
Ist eine tigervncsitzung zum Beenden aber vorhanden, z.b:

Code: Alles auswählen

tigervncserver -list

TigerVNC server sessions:

X DISPLAY #     RFB PORT #      PROCESS ID      SERVER
:1              5901            16658           Xtigervnc
dann funktioniert die Systemd Unit Datei und der tigervncserver wird via systemd ohne Fehler normal gestartet.

Beispiel:
Hier starte ich tigervncserver manuell.
So dass eine tigervncserver Session läuft.
Nun funktioniert das systemd Skript, weil es bei ExecStartPre erfolgreich weiterläuft.

Code: Alles auswählen

pi@raspberrypi:/etc/systemd/system $ tigervncserver 

New Xtigervnc server 'raspberrypi:1 (pi)' on port 5901 for display :1.
Use xtigervncviewer -SecurityTypes VncAuth -passwd /home/pi/.vnc/passwd :1 to connect to the VNC server.

pi@raspberrypi:/etc/systemd/system $ tigervncserver -list

TigerVNC server sessions:

X DISPLAY #     RFB PORT #      PROCESS ID      SERVER
:1              5901            17564           Xtigervnc
pi@raspberrypi:/etc/systemd/system $ sudo systemctl start tigervncserver@\:1.service 
pi@raspberrypi:/etc/systemd/system $ sudo systemctl status tigervncserver@\:1.service 
● tigervncserver@:1.service - Remote desktop service (VNC)
     Loaded: loaded (/etc/systemd/system/tigervncserver@.service; enabled; vendor preset: enabled)
     Active: activating (auto-restart) since Fri 2021-11-12 19:55:15 CET; 4s ago
    Process: 17805 ExecStartPre=/sbin/runuser -l pi -c /usr/bin/tigervncserver -kill :1 (code=exited, status=0/SUCCESS)
    Process: 17820 ExecStart=/sbin/runuser -l pi -c /usr/bin/tigervncserver  :1 (code=exited, status=0/SUCCESS)
    Process: 18029 ExecStop=/sbin/runuser -l pi -c /usr/bin/tigervncserver -kill :1 (code=exited, status=0/SUCCESS)
   Main PID: 17820 (code=exited, status=0/SUCCESS)
        CPU: 75ms

Nov 12 19:55:15 raspberrypi systemd[1]: tigervncserver@:1.service: Succeeded.
Ich suche jetzt also eine Lösung, wo es egal ist, ob vorher ein tigervncserver Prozess lief oder nicht.
Also dass der Rückgabewert der "ExecStartPre" Bedingung von systemd ignoriert wird.


Dann noch ein weiteres Problem:
Außerdem habe ich noch festgestellt, dass der Server ständig neu gestartet wird und sich die pid ändert.
Das liegt möglicherweise an der Option "Restart=on-success". Die brauche ich aber, falls der via VNC verbundene Nutzer die VNC Session beendet. Sich also bspw. aus der Desktopoberfläche im VNC Fenster ausloggt.
Dann wird der tigervncserver automatisch mit dem Exitstatus 0 beendet und ab dem Punkt sollte der tigervncserver wieder neu gestartet werden, damit er für die nächste Sitzung wieder verfügbar ist.
Das ständige neu starten alle paar Sekunden, nur weil das Systemd unit Skript fehlerfrei durchläuft, möchte ich aber vermeiden.
Ein "Restart=on-failure" funktioniert leider nicht, weil ein kontrolliertes ausloggen des Nutzers dann dazu führt, dass der Server gar nicht neu gestartet wird, denn er wurde ja mit Existatus 0 ohne Fehler beendet.

mat6937
Beiträge: 2953
Registriert: 09.12.2014 10:44:00

Re: Systemd wirft Fehlermeldung (code=exited, status=1/FAILURE) wenn Serveranwendung einen Fehlercode zurückmeldet

Beitrag von mat6937 » 13.11.2021 09:03:43

Cordess hat geschrieben: ↑ zum Beitrag ↑
12.11.2021 19:57:14
Ich suche jetzt also eine Lösung, wo es egal ist, ob vorher ein tigervncserver Prozess lief oder nicht.
Also dass der Rückgabewert der "ExecStartPre" Bedingung von systemd ignoriert wird.
Schau mal in der manpage für systemd.service, bei "Special executable prefixes" nach. Evtl. ist dort etwas Passendes dabei, um den Rückgabewert der "ExecStartPre" Bedingung zu ignorieren.
Cordess hat geschrieben: ↑ zum Beitrag ↑
12.11.2021 19:57:14
Dann noch ein weiteres Problem:
Außerdem habe ich noch festgestellt, dass der Server ständig neu gestartet wird und sich die pid ändert.
Das liegt möglicherweise an der Option "Restart=on-success". Die brauche ich aber, falls der via VNC verbundene Nutzer die VNC Session beendet. Sich also bspw. aus der Desktopoberfläche im VNC Fenster ausloggt.
Dann wird der tigervncserver automatisch mit dem Exitstatus 0 beendet und ab dem Punkt sollte der tigervncserver wieder neu gestartet werden, damit er für die nächste Sitzung wieder verfügbar ist.
Das ständige neu starten alle paar Sekunden, nur weil das Systemd unit Skript fehlerfrei durchläuft, möchte ich aber vermeiden.
Ein "Restart=on-failure" funktioniert leider nicht, weil ein kontrolliertes ausloggen des Nutzers dann dazu führt, dass der Server gar nicht neu gestartet wird, denn er wurde ja mit Existatus 0 ohne Fehler beendet.
Versuch mal mit:

Code: Alles auswählen

Restart=always
und mit "RestartPreventExitStatus= " kannst Du Ausnahmen setzten, bei welchen Rückgabewerten doch nicht neu gestartet werden soll.
Ist aber alles sehr gut, in der manpage erklärt.

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: Systemd wirft Fehlermeldung (code=exited, status=1/FAILURE) wenn Serveranwendung einen Fehlercode zurückmeldet

Beitrag von JTH » 13.11.2021 10:03:29

mat6937 hat geschrieben: ↑ zum Beitrag ↑
13.11.2021 09:03:43
Schau mal in der manpage für systemd.service, bei "Special executable prefixes" nach. Evtl. ist dort etwas Passendes dabei, um den Rückgabewert der "ExecStartPre" Bedingung zu ignorieren.
Ja, so ein Präfix gibt es. Ebenfalls siehe Manpage ;)
Manchmal bekannt als Just (another) Terminal Hacker.

Antworten