web-dev-qa-db-fra.com

Exécuter une commande si Linux est inactif pendant 5 minutes

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

16
user249704

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
5
Petr Shevtsov

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.

Les références

1
slm