Este hilo en los foros de ArchLinux contiene un breve programa en C que consulta xscreensaver para obtener información sobre cuánto tiempo ha estado inactivo el usuario, esto parece estar bastante cerca de sus requisitos:
#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);
}
Guardar esto como getIdle.c
y compilar con
gcc -o getIdle getIdle.c -lXss -lX11
para obtener un archivo ejecutable getIdle
. Este programa imprime el "tiempo de inactividad" (el usuario no se mueve/hace clic con el mouse, no usa el teclado) en milisegundos, por lo que un script de bash que se basa en esto podría tener este aspecto:
#!/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
Esto todavía necesita un sondeo regular, pero hace todo lo que necesita...
TMOUT en bash finalizará una sesión interactiva después del número de segundos establecido. Puede usar ese mecanismo.
Puede capturar el cierre de sesión configurando una trampa correspondiente (no probé eso), o usando los guiones de cierre de sesión de bash (~/.bash_logout).
Aquí hay una buena respuesta de superusuario en esa dirección.
Esto no es exactamente lo que pediste, pero siempre está el batch
-comando (generalmente una invocación especial del at
-comando y usando el atd
-demonio).
batch
le permite activar un comando para que se ejecute cuando el promedio de carga caiga por debajo de cierto límite (generalmente 1.5, pero esto se puede configurar al iniciar atd
). Con at
también es posible indicar un trabajo de tal manera que, en lugar de ejecutarse en un momento determinado; el trabajo acaba de entregarse a batch
en ese momento, y primero se ejecuta cuando el promedio de carga cae (por ejemplo, se ejecuta tan pronto como el promedio de carga cae por debajo de 1.5 en algún momento después de las 2:00 am).
Desafortunadamente, un trabajo por lotes se ejecutará hasta el final, no se detendrá si la computadora ya no está inactiva.
+++
Si tiene que seguir la ruta de programación (que se parece a las otras respuestas), creo que intentaría hacer algo similar al atd
o crond
demonios, que monitoreaban usuarios registrados y/o promedio de carga. Este demonio podría ejecutar secuencias de comandos/programas desde un directorio determinado e iniciarlos/continuarlos o detenerlos (con señales) según sea necesario.