XRDP und der schwarze Bildschirm

Die Leser von RemoteDesktop mit XRDP & XFreeRDP haben vielleicht noch im Kopf, da√ü RDP mit Linux mit Cinnamon einen schwarzen Bildschirm produziert hat, weil Cinnamon scheinbar viel mit Hardwarebeschleunigung arbeitet. Darum geht es heute nicht ūüėÄ

XRDP und der schwarze Bildschirm

Ein Ph√§nomen beim Ausprobieren von RDP mit Linux war, da√ü auf einem Linuxrechner die Desktopsession nicht zwangsl√§ufig weiter lief, wenn die Verbindung vom Clienten gekappt wurde. Wenn man mit RDP arbeitet, gibt es vier Gr√ľnde wieso eine Sitzung getrennt wird:

Netzwerkausfall: Verbindung unterbrochen
Sitzungsende: Benutzer loggt aus
Updates: Windows rebootet
WTF!: Der Benutzer fährt den RemotePC runter, statt sich abzumelden.

In den F√§llen, wo die Verbindung gekappt wird, kann man normal weiter arbeiten, wenn man die Verbindung durch einen Reconnect wieder herstellt. Bei Windows klappt das bis lang ohne Probleme, weswegen sich viele einfach gar nicht „abmelden“ sondern einfach den RDP Clienten beenden, ohne sich auszuloggen.

Jetzt versucht das Kunstst√ľck mal bei einem XRDP Server ūüôā Das kann funktionieren, habe ich heute erst erlebt, aber meistens geht es nicht. Man sieht nur einen schwarzen Bildschirm, wenn es √ľberhaupt funktioniert mit der erneuten Verbindung.

Nicht Remote, Nicht Lokal

Jetzt haben wir die kuriose Situation, daß wir per Remote nicht mehr in den PC kommen, und sich am Bildschirm einloggen als der Benutzer geht auch nicht. Zumindest ich habe keinen gleichzeitig lokalen wie remote Login geschafft, wenn man von SSH absieht.

Was macht man jetzt?

Es bleibt leider nur eins zu tun: per SSH einloggen und alles terminieren, was nicht im Screen l√§uft. Letzteres werde ich bei den jetzt folgenden Anweisungen nicht beachten, weil das ein von Euch selbst verursachter Spezialfall ist ūüėČ

Erstmal sondieren:

{benutzername}“ bitte als ganzes mit Euren Benutzernamen austauschen, die {} geh√∂ren zum Platzhalter.

sudo ps auxf | grep ^{benutzername} | awk ‚{print „kill -9 „$2“;# „$0;}‘

Das sieht erst einmal w√ľst aus, ist aber nur die normale Ausgabe aller Prozesse die vom Benutzer gestartet wurden. Das Kill vorne ist schon f√ľr die n√§chste Aktion vorbereitet und Ihr sollt eigentlich nur kurz pr√ľfen, ob da a) auch immer eine PID steht (Prozess-ID) b) was alles gekillt w√ľrde.

kill kann einem Prozess sagen, daß er sich selbst beenden soll, daß er sich neustarten sollen oder wenn der Prozess unreaktiv aka. tod ist, diesen hart beenden (-9 Option).

Wenn Ihr das gepr√ľft habt, dann k√∂nnt Ihr loslegen:

sudo ps auxf | grep ^{benutzername} | awk ‚{print „kill -9 „$2;}‘| bash

Ihr d√ľrft nat√ľrlich gern darauf vertrauen, da√ü es schon alles richtig ist und es gleich beenden, aber wenn was schief geht, nicht im Kommentarblock ausheulen ūüėČ

Bitte beachten:

Wenn man per SSH als der besagte Benutzer eingeloggt ist um sich seine Desktopsession zu terminieren, die Befehle oben betreffen auch die SSH Session! d.h. Ihr kickt Euch selbst dabei raus. Nicht wundern, das ist v√∂llig normal. Daher ggf. noch mal einloggen und pr√ľfen, ob auch wirklich alles weg ist, was weg sein sollte.

Das Problem l√§√üt sich elegant durch einen ROOT Login vermeiden, weil wenn der das macht, trifft es ihn nicht. Aber da root auch Prozesse von sich selbst wegkillen k√∂nnte, m√ľ√üt Ihr gerade bei so brutalen Kommandos die in der Shell zusammengestrickt sind extrem sorgsam sein.

Die Erklär-Sektion

farblich nochmal genau aufgeschl√ľsselt, was da gemacht wird:

sudo ps auxf | grep ^{benutzername} | awk{print „kill -9 „$2;}‚| bash

sudo¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†    f√ľhrt ps als Root aus, was Begrenzungen aller Art bei der Ausgabe verhindert.
                      Kann aber weg gelassen werden.
ps                    "Prozesslist"
auxf                  listet alle Prozesse mit PID Username und Kommando auf.
grep                  filter die Ausgabe von ps nach...
^benutzername         allen Zeilen die mit dem Benutzernamen beginnen, das ^ ist wichtig dabei.
awk                   zerlegt die gefilterten Ausgaben in einzelne Spalten und ordnet die neu an.
{print "kill -9 "$2;} die neue Anordnung des Inhalts von Spalte 2 ( der PID )
bash¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬† f√ľhrt die mit print zusammengebaute neue Anweisung "kill -9 PID" aus, 
                      wobei PID dann der Inhalt von Spalte 2 der Prozessliste ist.

Man erwischt so alle laufenden Prozesse des Users, egal wann, egal wieviele es sind.