Logout Script (nicht shutdown)

  • Hallo zusammen,

    ich bin neu hier und suche schon seit einiger Zeit nach der Lösung für mein kleines Problem.

    Zuerst aber etwas zu meiner Hard- und Software:

    Raspberry 3 B mit 2 TB USB-Platte und keiner SD Card. Der "Kleine" bootet einigermassen zuverlässig von der USB Platte und wird einmal in der Woche durch ein Script automatisch upgegraded. Als System verwendet ich Raspbian (32bit). Momentan meldet mir das System debian 10.12 als distro und als OS Version 5.10.103-v7+.


    Was heißt einigermassen zuverlässig booten? Ganz einfach, es kommt hin und wieder vor, dass es den Anschein hat, dass der "Kleine" läuft, im Netzwerk geht aber garnichts mehr, heißt ich komme auch nicht per RDP mehr an ihn ran. Dann muss ich mal kurz den Stecker ziehen und ihn so neu booten lassen. Danach läuft alles wieder wie es soll.

    Denn der "Kleine" war zunächst nur als DNS Serverersatz gedacht, d.h. ich verwende pihole.


    Jetzt etwas zu meinem Problem:

    Seit einiger Zeit beobachte ich, dass da immer wieder Prozesse scheinbar hängen bleiben. Heißt wenn ich mich per RDP mit dem "Kleinen" verbunden habe, dann finde ich da einen Prozess ssh-agent (und noch ein paar andere, u.a. applet.py) Diese bleiben auch nach einem Logout bestehen und wenn ich dann wieder einlogge (per RDP) kommt ein weiterer ssh-agent (und die anderen) dazu. Auffallen tut das Ganze, da mir der "Kleine" dreimal am Tag einen Status per Mail schickt und da dann diese Dinge zu sehen sind.


    Jetzt habe ich im Internet gewühlt und bin da auf einige Dinge gestossen. Das was dabei am vielversprechensden klang war das Thema lightdm und session-cleanup-script. Hier gibt es wohl drei Stellen wo man dazu was einbauen kann. Aber leider funktioniert davon nichts wirklich (oder, was ich glaube, ich bin zu blöd dazu). Angeblich soll das Script, welches man bei diesem Eintrag hinterlegen kann (mit vollständigem Pfad) dann laufen, wenn ein User sich ausloggt. Denn ich will ja nicht bei jedem User da was mit dem ~bash.logout oder so ähnlich was anfangen sondern nur einmal was angeben und ändern müssen, falls es mal Änderungen gibt. (Anmerlkung: Mein Script kann von jedem gelesen und auch ausgeführt werden.)


    Was ich feststellen konnte ist, das Script läuft wenn es zu einem Reboot kommt. Aber wenn sich ein User ausloggt, dann passiert da nichts.


    Meine Frage also: Kennt jemand da eine einfache Lösung mit der man ein Script beim Logout eines Users ausführen kann ohne jedes Mal gleich einen Reboot machen zu müssen.


    Ich habe momentan da folgendes Workaround: Da der "Kleine" mir dreimal am Tag einen Statusbericht per Mail schickt, lasse ich das Script dabei dann auch immer mit laufen und protokolliere das Ergebnis, falls er hängengebliebene Prozesse gefunden hat. Das klappt, aber es wäre schöner, wenn es direkt beim Logout passieren würde.


    Gruss
    Micha

  • Moin Micha,


    sprichst du von den Prozessen die in der RDP genutzt werden und nach dem beenden der RDP nicht beendet werden oder im Hintergrund weiterlaufen?

    oder sind es noch andere?


    Es könnte sein, dass die Prozesse nach schließen der RDP nicht beendet werden und mit jeder neuen RDP eine neue Instanz erstellt wird.

    Dadurch entstehen dann diese toten Prozesse.


    Es würde jetzt viele verschiedene Möglichkeiten geben.

    Z.B.:

    #1 Script-Kontrolle der Prozesse. -- Wenn inaktiv dann kill.

    #2 Script-zeitliche restarts der Prozesse. -- Wenn 1500 dann restart xxx

    #3 Script-zeitliche RDP-Sitzung. -- Wenn RDP älter 30min close with script

    #...


    und so weiter.


    Könntest du dein Script mit Pfadangaben mal posten?

  • Hallo Neoroxx,

    zuerst einmal Danke für die schnelle Antwort.


    Ich spreche von den Prozessen, die in der RDP genutzt werden. Es sind keine anderen.


    Und mein Script ist im wesentlichen so:


    #! /bin/bash


    sudo killall -v ssh-agent >> /usr/tmp/sshlog.txt

    sudo killall -v agent >> /usr/tmp/sshlog.txt

    sudo killall -v applet.py >> /usr/tmp/sshlog.txt

    sudo chmod 666 /usr/tmp/sshlog.txt


    Das Script habe ich in /usr/share/lightdm abgelegt. Rechte rwxr-xr-x, Owner und Group root.

    Das Verzeichnis /usr/tmp habe ich angelegt, Rechte rwxrwxrwx

    Das chmod brauche ich für das Ausführen im Fall der Statusmeldung, denn die wird über einen anderen User erzeugt und das Protokollieren im Fall reboot macht da nur rw-r--r--, denn das läuft ja als root. Und dann klappt das nicht mehr bei der Statusmeldung.

    Der Eintrag des session-cleanup-script ist in /etc/lightdm/lightdm.conf Bereich [Seat:*]. Denn das ist der globalste Platz auch wenn alle anderen Einträge dieser Datei bei mir auskommentiert sind.


    Das Script wird beim Erstellen der Statusmeldung auch erfolgreich ausgeführt. Denn wenn die Datei sshlog.txt vorhanden ist, bekomme ich den Inhalt in der Mail zu sehen. Auch wenn ein Reboot ausgeführt wird, dann wird das Script ausgeführt. Denn die Datei erscheint dann auch im Anschluss an die Ausgabe des boot.log. Denn im Fall des reboot bekomme ich auch eine Mail mit den entsprechenden Ausgaben. Nur wird die Datei dann nicht gelöscht, was bei der Statusmeldung im Abschluss der Fall ist.

    Nur der Hinweis, den man immer wieder im Internet findet, dass dieses Script auch beim Logout eines Users ausgeführt wird scheint hier bei Raspbian nicht zu stimmen.


    Eine zeitliche Begrenzung einer RDP Sitzung kann ich keider nicht verwenden, denn manchmal geht es schnell dass ich mit dem "Besuch" fertig bin, in einem anderen Fall dauert es dann schon einmal etwas länger. Und man kann nie sagen wie lang. Denn an so etwas hatte ich auch schon gedacht.


    Dann bin ich da auch noch auf Hinweise zu systemd gestossen, aber das wird mir etwas zu komplex. Zumal ich da bisher auch noch nicht auf eine wirklich gute und vorallem vollständige Beschreibung von systemd gestossen bin.


    Noch einmal danke für Deine Antwort.
    Gruss
    Micha

  • Hallo,


    Quote

    Dann bin ich da auch noch auf Hinweise zu systemd gestossen, aber das wird mir etwas zu komplex.

    Das ist IMHO aber der richtige Weg.

    Wenn du in der Datei /etc/systemd/logind.conf die Zeile `KillUserProcesses=no`einkommentierst und aus dem `no` ein `yes` machst sollten alle Prozess, die dem User gehören, beim Logout gekillt werden.

    In wie weit das auch für Remote Sessions über RDP gilt weiß ich nicht, müsstest du mal testen.

    Quote
    Zumal ich da bisher auch noch nicht auf eine wirklich gute und vorallem vollständige Beschreibung von systemd gestossen bin.

    https://www.freedesktop.org/software/systemd/man/ - das systemd sehr umfangreich ist, ist das ein bisschen mehr zu lesen... ;)


    Gruß, noisefloor

  • Hallo noisefloor,


    auch Dir ein Danke für die Antwort und ich werde das ausprobieren und hier Rückmeldung geben. Denn in Kürze ist wieder eine Statusmeldung fällig. Danach muss ich das dann nur entsprechend ändern und wohl auch einen Reboot machen, denn die Datei muss von systemd ja wohl neu eingelesen werden.


    Und mit dem "bisschen" mehr zu lesen habe ich kein Problem. Danke für den Tipp


    Gruss
    Micha

  • Hallo,


    hier die Rückmeldung zu dem empfohlenen Vorgehen. Das scheint leider nicht ganz die Lösung zu sein.


    Ich habe den Eintrag entsprechend einkommentiert und aus dem no ein yes gemacht. Danach ein Reboot. Dann bestand allerdings das Problem, dass pihole nicht mehr richtig funktionierte und ich nur noch die Verbindung zu dem "Kleinen" bekam. Alle anderen IP Adressen, speziell auch die im Internet waren nicht mehr erreichbar. Denn pihole scheint da ein kleines Pronblem zu haben. Auch dauerte der Aufbau der RDP Verbindung deutlich länger als sonst.


    Also habe ich alles wieder zurückgedreht und einen Reboot gemacht. Alles wieder beim Alten. Da ist also wohl noch ein bisschen mehr zu machen und dann wäre zwar das Problem mit den hängengebliebenen Prozessen gelöst, nicht aber mein eigentliches Problem mit dem Logoutscript.


    Zugegeben, im Moment kümmere ich mich nur um das "Aufräumen", aber andere Aufgaben könnten folgen und da wäre die vorgeschlagene Lösung nicht unbedingt hilfreich. Ich werde aber an dieser Sache dran bleiben und vielleicht finde ich ja die Lösung. Denn die vorgeschlagene Lösung gefällt mir eigentlich sehr gut und wäre auch folgerichtig.


    Und vielleicht hat jemand ja noch eine andere Idee.
    Gruss
    Micha