Ich möchte einen Befehl ausführen, wenn der Benutzer inaktiv wird (das System ist inaktiv). Beispielsweise:
echo "You started to be inactive."
Wenn der Benutzer wieder aktiv wird (das System ist nicht mehr im Leerlauf):
echo "You started to be active, again."
Ich benötige ein Shell-Skript, das dies erledigt. Ist das ohne Timer / Intervall möglich? Vielleicht einige Systemereignisse?
Antworten:
Dieser Thread in den ArchLinux-Foren enthält ein kurzes C-Programm, das den xscreensaver abfragt, um zu erfahren, wie lange der Benutzer inaktiv war. Dies scheint Ihren Anforderungen ziemlich nahe zu kommen:
Speichern Sie diese als
getIdle.c
und kompilieren Sie mitum eine ausführbare Datei zu erhalten
getIdle
. Dieses Programm gibt die "Leerlaufzeit" (Benutzer bewegt / klickt nicht mit der Maus, verwendet keine Tastatur) in Millisekunden aus, sodass ein darauf aufbauendes Bash-Skript folgendermaßen aussehen könnte:Dies erfordert noch regelmäßige Abfragen, aber es tut alles, was Sie brauchen ...
quelle
xprintidle
, was in den meisten Distributionen verfügbar ist und genau dasselbe tut.TMOUT in bash beendet eine interaktive Sitzung nach der festgelegten Anzahl von Sekunden. Sie können diesen Mechanismus verwenden.
Sie können die Abmeldung erfassen, 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.
quelle
$TMOUT
Sekunden abzumelden.EXIT
Falle noch von.bash_logout
.Dies ist nicht ganz das, wonach Sie gefragt haben, aber es gibt immer den Befehl -command
batch
(normalerweise ein spezieller Aufruf desat
Befehls und die Verwendung desatd
Dämons -daemon).batch
Ermöglicht das Aufrufen eines Befehls, der ausgeführt wird, wenn der Lastdurchschnitt eine bestimmte Grenze unterschreitet (normalerweise 1,5, kann jedoch beim Starten festgelegt werdenatd
). Damit istat
es auch möglich, einen Job so anzuweisen, dass er nicht zu einer bestimmten Zeit ausgeführt wird. Der Job wird gerade zubatch
diesem Zeitpunkt geliefert und zum ersten Mal ausgeführt, wenn der Lastdurchschnitt abfällt (z. B., wenn der Lastdurchschnitt irgendwann nach 2:00 Uhr unter 1,5 abfällt).Leider läuft ein Batch-Job dann zu Ende, er stoppt nicht, wenn der Computer nicht mehr im Leerlauf ist.
+++
Wenn Sie die Programmierroute gehen müssen (wie es aus den anderen Antworten hervorgeht), würde ich versuchen, etwas Ähnliches wie die Dämonen
atd
oder zu machencrond
, die die angemeldeten Benutzer und / oder den Lastdurchschnitt überwachen. Dieser Daemon könnte dann Skripte / Programme aus einem bestimmten Verzeichnis ausführen und diese nach Bedarf starten / fortsetzen oder stoppen (mit Signalen).quelle
.lock
Dateien verwenden, können Sie Zeitprobleme leicht lösen.Dieser Thread bietet eine Reihe von Lösungen, die auf der Erkennung von Tastatur- und Mausaktivitäten basieren. Ich laufe
xprintidle
von einem Cron Job aus, der alle paar Minuten startet. Aber wie sie darauf hinweisen,xprintidle
ist dies nicht der Fall. Vielleicht möchten Sie das Perl-Modul installieren und dieses stattdessen verwenden:Ich würde beide Lösungen durch Abfragen von cron in einem Skript verwenden, das oben beendet wird, wenn die Benutzeroberfläche nicht ausreichend inaktiv ist. Natürlich würde das Skript eine benötigen
export DISPLAY=:0.0
, um mit X11 zu sprechen.Denken Sie daran, dass Ihre Tastatur und Maus möglicherweise inaktiv sind, wenn Sie einen Film ansehen oder eine CPU-schwere Aufgabe ausführen.
quelle
Ich kenne keine Möglichkeit, dies zu tun, ohne eine Art Systemstatistik abzufragen, wie die anderen Antworten einen Bildschirmschoner oder einen Bash-Leerlauf-Timer verwenden oder von .bash_logout aus ausgeführt werden, aber hier ist eine Idee, die CPU-Auslastung zu überprüfen.
Dies würde immer noch ein Abfragen alle n Sekunden beinhalten. Wenn Ihre CPU-Auslastung unter dem von Ihnen gewählten Wert liegt, können Sie Skripte erstellen, die Sie ausführen möchten. Was auch immer Sie ausführen, kann die CPU-Auslastung erhöhen, aber Sie können Ihre "Sachen" auch gut nutzen, um sie nicht zu zählen.
Hier ist ein Testskript mit top, aber Sie könnten stattdessen mpstat verwenden oder stattdessen die Durchschnittswerte für das Laden überprüfen?
Das ist nur ein Skript, das ich zusammengestellt habe, um zu testen, ob ich den Leerlauf von oben gelesen habe. Sie könnten analysieren,
/proc/stat
aber ich denke, es werden nur die Gesamtzeiten angezeigt, und Sie müssen die Ergebnisse über einen Zeitraum vergleichen. Top hat für mich ein eigenes problem (linux mint 16), auf den ersten blick scheint es cpustats nie zu ändern, als ob es warten müsste, um / proc / stat selbst zu parsen, daher sollte dastop -bn2
aber theoretischtop -bn1
funktionieren.quelle
w
Befehl abrufen, der die Leerlaufzeit des Benutzers anzeigt. - Übrigens, ich urteile nicht, es ist nur so, dass ich Leerlauf feststellen möchte, um die Maschine in den Ruhezustand zu versetzen, um Energie zu sparen, und Polling geht dagegen vor.