Aktion ausführen wenn x-Minuten lang kein Benutzer angemeldet war

  • Hallo,


    ich möchte gerne bestimmte Aktionen ausführen, wenn x Minuten lang kein Benutzer angemeldet war.
    Mit

    Code
    who -u


    und

    Code
    pure-ftpwho -s


    kann ich ja abfragen, ob (und wer) aktuell angemeldet ist.
    Ist eine bestimmte Zeitspanne kein benutzer angemeldet, dann möchte ich de Maschine runterfahren (oder in den Standby schicken).


    Muss ich jetzt zyklisch (mit Ausführungszeit < x Minuten) protokollieren ob jemand angemeldet ist und wenn x Minuten keiner angemeldet war, dann die gewünschte Aktion ausführen lassen.
    Oder gibt es da eine effektivere Variante?
    Wie lösen das diverse VDR-Implentierungen, die diese Option anbieten?
    (Ich habe leider keine in reichweite zum anschauen.)


    Vielen Dank schonmal für eure Tipps.

  • Wie lösen das diverse VDR-Implentierungen, die diese Option anbieten?


    Der VDR ruft ein Script auf wenn er sich beenden will (automatisch oder auf Benutzeranforderung). Da gibt es ein Shutdowsnwrapper Script was diverse Pluginscripts einbinden kann, eines dieser Pluginsscripte (liveguard) kann div. Sachen prüfen (user angemeldet usw.) und dann den shutdowsn abbrechen, der VDR versuchts dann erneut in 5 Minuten. Das System binden viele VDR Distributionen ein.


    Ist also ein anderer Sachverhalt als dein Problem, denn hier fordert ein Programm das runterfahren an udn ein Script sagt ja oder nein.


    cu

  • Vielleicht waere "last" das Kommando, das Du statt dem "who" einsetzen koenntest? Die Auswertung wird halt ein bisschen knifflig. "date" bietet aber da nette Optionen wie "two hours ago".


    Ich mache an einer Kiste sowas aehnliches: wenn die Kiste 2h idle ist (und sich niemand eingeloggt hat), dann geht sie wieder aus. Aeltere Herrschaften vergessen gerne mal, was sie eigentlich machen wollten :) .


    Ich lasse von cron dazu jede Minute ein Script laufen und fuege einer Datei in /tmp eine Zeile hinzu. Loggt sich jemand ein, wird die Datei geloescht. Hat die Datei mehr als 120 Zeilen faehrt der Rechner runter und loescht dann automatisch die Datei beim naechsten Hochfahren.


    Es gibt aber wohl tausend Methoden das umzusetzen.


    uwe

    server: yavdr trusty testing, 2 * L5420, 32GB, 64TB RAID6 an OctopusNet (DVBS2- 8 ) + minisatip@dsi400 (DVBS2- 4 )
    frontends: kodi und xine

  • Vielleicht waere "last" das Kommando, das Du statt dem "who" einsetzen koenntest? Die Auswertung wird halt ein bisschen knifflig. "date" bietet aber da nette Optionen wie "two hours ago".


    Ich mache an einer Kiste sowas aehnliches: wenn die Kiste 2h idle ist (und sich niemand eingeloggt hat), dann geht sie wieder aus. Aeltere Herrschaften vergessen gerne mal, was sie eigentlich machen wollten :) .


    Ich lasse von cron dazu jede Minute ein Script laufen und fuege einer Datei in /tmp eine Zeile hinzu. Loggt sich jemand ein, wird die Datei geloescht. Hat die Datei mehr als 120 Zeilen faehrt der Rechner runter und loescht dann automatisch die Datei beim naechsten Hochfahren.


    Deine Variante erscheint mir wie "von Hinten durch die Brust in's Auge",
    aber danke für den Hinweis mit last.


    Ich werd mir wohl mal in Ruhe Gedanken dazu machen und mir gegebenenfalls einen eigenen Daemon dafür schreiben der zyklisch die Logins überwacht und entsprechende Abfragen beantworten kann - das ganze gepaart mit einem Abfrage-Script, dass ich per Cron-Job starte dürfte wohl die generischste Variante sein, die ich programmieren kann.
    Alternativ baue ich die Shutdown-Funktion gleich mit in den Daemon ein.

  • Deine Variante erscheint mir wie "von Hinten durch die Brust in's Auge"

    Danke fuer die Blumen :) .
    So ist das beim Shellprogrammieren halt. Unter Einbeziehung der Shell-Raum-Zeit-Kruemmung ist "von hinten durch die Brust ins Auge" manchmal eine Gerade.


    Bin fuer gute Vorschlaege, den Fuenfzeiler zu ersetzen, jederzeit offen.


    uwe


    ggfalls koenntest Du auch "inotify" (dafuer gibt's commandline-Tools) auf Files wie /var/log/wtmp ansetzen (denn da hat "last" seine Informationen her).
    Ist niemand eingeloggt und das File aelter als zwei Stunden, dann den Stecker ziehen (funzt aber wieder nicht, wenn das File von logrotate gedreht wurde) - und muss halt auch wieder zyklisch geprueft werden. Womit Du vermutlich schon wieder am Ruecken bist ....

    server: yavdr trusty testing, 2 * L5420, 32GB, 64TB RAID6 an OctopusNet (DVBS2- 8 ) + minisatip@dsi400 (DVBS2- 4 )
    frontends: kodi und xine

  • Das wäre dann wohl sowas:

    Code
    if [ -z "`who`" -a -z "`find /var/log/ -maxdepth 1 -name 'wtmp*' -mmin -120`" ]; then
        echo Keiner da!
    fi

    :wow

    Give root password for maintenance (or type Control-D to continue): _

  • Den Asterisk am wtmp wuerde ich zur Sicherheit noch weglassen (hab' schlechte Erfahrungen mit Asterisken gemacht). Macht glatt einen Einzeiler. Sauber!


    Sieht gut aus (sieht man von dem seltenen Logrotateproblem ab)!


    Bleibt noch die Sache mit dem cron-Job.


    uwe

    server: yavdr trusty testing, 2 * L5420, 32GB, 64TB RAID6 an OctopusNet (DVBS2- 8 ) + minisatip@dsi400 (DVBS2- 4 )
    frontends: kodi und xine

  • Der Stern soll eigentlich das logrotate-Problem umgehen. Sonst könnte man direkt find /var/log/wtmp schreiben.


    ... plötzlich erscheint mir die last-Ausgabe viel attraktiver.

    Give root password for maintenance (or type Control-D to continue): _

  • Danke fuer die Blumen :) .
    So ist das beim Shellprogrammieren halt. Unter Einbeziehung der Shell-Raum-Zeit-Kruemmung ist "von hinten durch die Brust ins Auge" manchmal eine Gerade.


    Bin fuer gute Vorschlaege, den Fuenfzeiler zu ersetzen, jederzeit offen.


    Meine Einschätzung sollte nicht als destruktive Kritik an Deiner Lösung verstanden werden, sondern ich wollte nur ausdrücken, dass das für mich eher nicht in Betracht kommt.
    Aber ich hatte ja explizit nach Lösungsideen gefragt und Deine hat den Vorteil mit 5 Zeilen Code auszukommen, wohingegen meine deutlich umfangreicher und schwergewichtiger sein wird.
    (Insbesondere in puncto Ressourcen-Verbrauch - auch wenn der immernoch verschwindend gering sein wird.)


    Im Endeffekt will ich ja einige Dienste mehr als nur ein paar lokale Logins überwachen (ssh, ftp, smb, ...) und dafür den nach außen hin eleganter wirkenden Weg wählen.
    (Mit einer Datenbank statt deiner 120 Files.)

  • Zitat

    Mit einer Datenbank statt deiner 120 Files

    Ist nicht wirklich wichtig, aber ich meinte 120 Zeilen in einer Datei. Da habe ich mich wohl nicht richtig ausgedrueckt.
    Spaetestens 120 Dateien wuerde dann auch ich fuer bescheuert halten.


    Die Loesung von tag ist wirklich gut - sieht man von dem Fehler einmal die Woche ab :-).
    Es gaebe noch einige Optimierungen um das seltener als minuetlich laufen zu lassen (naechste Pruefung mit "at" erst bei "timestamp von wtmp + 120 Minuten), aber hinterher versteht das keine Sau mehr. Manchmal ist es besser ein paar Taktzyklen zu verschwenden als hinterher alles nochmal zu machen, weil man sich nicht erinnert.



    uwe

    server: yavdr trusty testing, 2 * L5420, 32GB, 64TB RAID6 an OctopusNet (DVBS2- 8 ) + minisatip@dsi400 (DVBS2- 4 )
    frontends: kodi und xine

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!