Questo thread sui forum di ArchLinux contiene un breve programma C che interroga l'xscreensaver per informazioni su quanto tempo l'utente è rimasto inattivo, questo sembra essere abbastanza vicino alle tue esigenze:
#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);
}
Salvalo come getIdle.c
e compilare con
gcc -o getIdle getIdle.c -lXss -lX11
per ottenere un file eseguibile getIdle
. Questo programma stampa il "tempo di inattività" (l'utente non si muove/fa clic con il mouse, non usa la tastiera) in millisecondi, quindi uno script bash che si basa su questo potrebbe apparire così:
#!/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
Questo necessita ancora di sondaggi regolari, ma fa tutto ciò di cui hai bisogno...
TMOUT in bash terminerà una sessione interattiva dopo il numero di secondi impostato. Puoi usare quel meccanismo.
Puoi catturare il logout impostando una trap corrispondente (non l'ho testato) o usando gli script bash-logout (~/.bash_logout).
Ecco una buona risposta da superutente in quella direzione.
Questo non è proprio quello che hai chiesto, ma c'è sempre il batch
-command (di solito un'invocazione speciale del comando at
-command e utilizzando il atd
-daemon).
batch
ti consente di avviare un comando da eseguire quando la media del carico scende al di sotto di un certo limite (di solito 1,5, ma questo può essere impostato all'avvio di atd
). Con at
è anche possibile indicare un lavoro in modo tale che invece di essere eseguito in un determinato momento; il lavoro è appena stato consegnato a batch
in quel momento, e viene eseguito per la prima volta quando la media del carico scende (ad es. viene eseguito non appena la media del carico scende sotto 1,5 qualche volta dopo le 2:00).
Sfortunatamente un processo batch verrà quindi eseguito fino alla fine, non si fermerà se il computer non è più inattivo.
+++
Se devi seguire il percorso di programmazione (che sembra dalle altre risposte), penso che proverei a creare qualcosa di simile al atd
o crond
demoni, che monitoravano gli utenti loggati e/o il carico medio. Questo demone potrebbe quindi eseguire script/programmi da una determinata directory e avviarli/continuarli o interromperli (con segnali) secondo necessità.