Ce fil sur les forums ArchLinux contient un court programme C qui interroge xscreensaver pour savoir combien de temps l'utilisateur a été inactif, cela semble être assez proche de vos besoins :
#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);
}
Enregistrez-le sous getIdle.c
et compiler avec
gcc -o getIdle getIdle.c -lXss -lX11
pour obtenir un fichier exécutable getIdle
. Ce programme imprime le "temps d'inactivité" (l'utilisateur ne bouge pas/ne clique pas avec la souris, n'utilise pas le clavier) en millisecondes, donc un script bash qui s'appuie sur cela pourrait ressembler à ceci :
#!/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
Cela nécessite toujours une interrogation régulière, mais il fait tout ce dont vous avez besoin...
TMOUT dans bash mettra fin à une session interactive après le nombre de secondes défini. Vous pouvez utiliser ce mécanisme.
Vous pouvez capturer la déconnexion en définissant un piège correspondant (je n'ai pas testé cela) ou en utilisant les scripts bash-logout (~/.bash_logout).
Voici une bonne réponse de superutilisateur dans cette direction.
Ce n'est pas tout à fait ce que vous avez demandé, mais il y a toujours le batch
-commande (généralement une invocation spéciale du at
-commande et en utilisant le atd
-démon).
batch
vous permet de sélectionner une commande à exécuter lorsque la charge moyenne tombe en dessous d'une certaine limite (généralement 1,5, mais cela peut être défini au démarrage de atd
). Avec at
il est également possible de signaler un travail de telle manière que plutôt que d'être exécuté à un certain moment ; le travail vient d'être livré à batch
à ce moment-là, et première exécution lorsque la charge moyenne baisse (par exemple, il est exécuté dès que la charge moyenne tombe en dessous de 1,5 quelque temps après 2h00).
Malheureusement, un travail par lots s'exécutera alors jusqu'à sa fin, il ne s'arrêtera pas si l'ordinateur n'est plus inactif.
+++
Si vous devez suivre la voie de programmation (à laquelle cela ressemble dans les autres réponses), je pense que j'essaierais de faire quelque chose de similaire au atd
ou crond
démons, qui surveillaient les utilisateurs connectés et/ou la charge moyenne. Ce démon pourrait alors exécuter des scripts/programmes à partir d'un certain répertoire, et les démarrer/continuer ou les arrêter (avec des signaux) selon les besoins.