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
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).
Code: Alles auswählen
tigervncserver -list
TigerVNC server sessions:
X DISPLAY # RFB PORT # PROCESS ID SERVER
:1 5901 16658 Xtigervnc
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.
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.