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).