GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Führen Sie einen Befehl aus, wenn das System im Leerlauf ist und wenn es wieder aktiv ist

Dieser Thread in den ArchLinux-Foren enthält ein kurzes C-Programm, das den xscreensaver nach Informationen abfragt, wie lange der Benutzer untätig war, dies scheint Ihren Anforderungen ziemlich nahe zu kommen:

#include <X11/extensions/scrnsaver.h>
#include <stdio.h>

int main(void) {
    Display *dpy = XOpenDisplay(NULL);

    if (!dpy) {
        return(1);
    }

    XScreenSaverInfo *info = XScreenSaverAllocInfo();
    XScreenSaverQueryInfo(dpy, DefaultRootWindow(dpy), info);
    printf("%u\n", info->idle);

      return(0);
}

Speichern Sie dies als getIdle.c und kompilieren mit

gcc -o getIdle getIdle.c -lXss -lX11

um eine ausführbare Datei getIdle zu erhalten . Dieses Programm gibt die "Leerlaufzeit" (Benutzer bewegt/klickt nicht mit der Maus, verwendet keine Tastatur) in Millisekunden aus, also könnte ein Bash-Skript, das darauf aufbaut, so aussehen:

#!/bin/bash

idle=false
idleAfter=3000     # consider idle after 3000 ms

while true; do
  idleTimeMillis=$(./getIdle)
  echo $idleTimeMillis  # just for debug purposes.
  if [[ $idle = false && $idleTimeMillis -gt $idleAfter ]] ; then
    echo "start idle"   # or whatever command(s) you want to run...
    idle=true
  fi

  if [[ $idle = true && $idleTimeMillis -lt $idleAfter ]] ; then
    echo "end idle"     # same here.
    idle=false
  fi
  sleep 1      # polling interval

done

Dies erfordert immer noch regelmäßige Abfragen, aber es tut alles, was Sie brauchen ...


TMOUT in bash beendet eine interaktive Sitzung nach der festgelegten Anzahl von Sekunden. Sie können diesen Mechanismus verwenden.

Sie können den Logout abfangen, indem Sie einen entsprechenden Trap setzen (das habe ich nicht getestet), oder indem Sie die Bash-Logout-Skripte (~/.bash_logout) verwenden.

Hier ist eine gute Superuser-Antwort in diese Richtung.


Das ist nicht ganz das, wonach Sie gefragt haben, aber es gibt immer den batch -Befehl (normalerweise ein spezieller Aufruf des at -Befehl und mit dem atd -Daemon).

batch lässt Sie einen Befehl aufrufen, der ausgeführt werden soll, wenn der Lastdurchschnitt unter eine bestimmte Grenze fällt (normalerweise 1,5, aber dies kann beim Starten von atd festgelegt werden ). Mit at es ist auch möglich, einen Job so zu cuen, dass er nicht zu einer bestimmten Zeit ausgeführt wird; der Job wird einfach an batch geliefert zu dieser Zeit, und zuerst ausgeführt, wenn der Lastdurchschnitt fällt (z. B. wird es ausgeführt, sobald der Lastdurchschnitt irgendwann nach 2:00 Uhr unter 1,5 fällt).

Leider läuft dann ein Batch-Job zu Ende, er stoppt nicht, wenn der Rechner nicht mehr im Leerlauf ist.

+++

Wenn Sie den Programmierweg gehen müssen (wie es aus den anderen Antworten aussieht), würde ich versuchen, etwas Ähnliches wie atd zu machen oder crond Daemons, die eingeloggte Benutzer und/oder Load-Average überwachen. Dieser Daemon könnte dann Skripte/Programme aus einem bestimmten Verzeichnis ausführen und sie nach Bedarf starten/fortsetzen oder stoppen (mit Signalen).


Linux
  1. Verwenden des Befehls timedatectl zum Ändern von Uhrzeit und Datum auf einem RHEL7-Linux-System

  2. 10 erstaunliche und mysteriöse Verwendungen von (!) Symbolen oder Operatoren in Linux-Befehlen

  3. Wie wird ein Befehl ausgeführt, wenn der Inhalt eines Verzeichnisses aktualisiert wird?

  4. Wie Sie Ihr erstes Qt-Programm in Debian 10 schreiben und ausführen

  5. Wie kann man das Ubuntu-System dazu bringen, vollständig im RAM zu booten und zu laufen?

So finden Sie heraus, wer das Linux-System wann neu gestartet hat

So identifizieren Sie das Betriebssystem mithilfe des TTL-Werts und des Ping-Befehls

Wichtige Befehle zum Anzeigen von Hardware- und Systeminformationen in Linux

40 Einfacher und effektiver „lsof-Befehl“ im Linux-System

So installieren und verwenden Sie den Ack-Befehl im Linux-System

So führen Sie .run- und .bin-Pakete im Linux-System aus