Je voudrais exécuter une commande telle que
notify-send 'a'
si ma machine Linux a été inactive pendant 5 minutes.
Par ralenti, je veux dire la même chose qu'un économiseur d'écran qui est activé utiliserait pour définir "inactif".
J'utilise xssstate
à ces fins. Il est disponible en suckless-tools
Package in Debian ou bunt , ou en amont .
Ensuite, vous pouvez utiliser le script shell suivant:
#!/bin/sh
if [ $# -lt 2 ];
then
printf "usage: %s minutes command\n" "$(basename $0)" 2>&1
exit 1
fi
timeout=$(($1*60*1000))
shift
cmd="$@"
triggered=false
while true
do
tosleep=$(((timeout - $(xssstate -i)) / 1000))
if [ $tosleep -le 0 ];
then
$triggered || $cmd
triggered=true
else
triggered=false
sleep $tosleep
fi
done
Voici une application C que j'ai trouvée que vous pouvez compiler.
$ more xidle.c
#include <stdio.h>
#include <X11/Xlib.h>
#include <X11/extensions/scrnsaver.h>
/* Report amount of X server idle time. */
/* Build with- */
/* cc xidle.c -o xidle -lX11 -lXext -lXss */
int main(int argc, char *argv[])
{
Display *display;
int event_base, error_base;
XScreenSaverInfo info;
float seconds;
display = XOpenDisplay("");
if (XScreenSaverQueryExtension(display, &event_base, &error_base)) {
XScreenSaverQueryInfo(display, DefaultRootWindow(display), &info);
seconds = (float)info.idle/1000.0f;
printf("%f\n",seconds);
return(0);
}
else {
fprintf(stderr,"Error: XScreenSaver Extension not present\n");
return(1);
}
}
Il a besoin de quelques bibliothèques pour construire. Sur mon système Fedora 19, j'avais besoin des bibliothèques suivantes:
$ rpm -qf /lib64/libX11.so.6 /lib64/libXext.so.6 /lib64/libXss.so.1
libX11-1.6.0-1.fc19.x86_64
libXext-1.3.2-1.fc19.x86_64
libXScrnSaver-1.2.2-5.fc19.x86_64
Une fois ceux-ci installés, j'ai compilé ce qui précède comme:
$ gcc xidle.c -o xidle -lX11 -lXext -lXss
Vous pouvez voir qu'il est capable de signaler le nombre de secondes que X détecte le temps de ralenti en l'exécutant comme suit:
$ while [ 1 ]; do ./xidle ; sleep 2;done
0.005000
1.948000
3.954000
5.959000
7.965000
0.073000 <--- moved the mouse here which resets it
0.035000
En utilisant cet exécutable, vous pouvez assembler un script qui peut faire quelque chose comme ceci, surveillant le temps de ralenti rapporté par xidle
.
$ while [ 1 ]; do idle=$(./xidle);
[ $( echo "$idle > 5" | bc ) -eq 0 ] && echo "still < 5" || echo "now > 5";
sleep 2;
done
still < 5
still < 5
still < 5
now > 5
now > 5
still < 5
still < 5
still < 5
Ce qui précède montre still < 5
Jusqu'à 5 secondes de temps de ralenti se sont écoulés, à quel point cela commence à dire now > 5
, ce qui signifie que plus de 5 secondes est passée.
Remarque: Vous pouvez incorporer votre notify-send 'a'
dans l'exemple ci-dessus.