GNU/Linux >> Tutoriels Linux >  >> Linux

Exécuter une commande lorsque le système est inactif et lorsqu'il est à nouveau actif

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.


Linux
  1. Utilisation de la commande timedatectl pour modifier l'heure et la date sur le système Linux RHEL7

  2. Comment exécuter une commande en tant qu'administrateur système (racine) ?

  3. Comment exécuter une commande lorsque le contenu d'un répertoire est mis à jour ?

  4. Que se passe-t-il lorsque j'exécute la commande Cat /proc/cpuinfo ?

  5. Comment faire pour que le système Ubuntu démarre et s'exécute entièrement en RAM?

Comment trouver qui a redémarré le système Linux et quand

Comment identifier le système d'exploitation à l'aide de la valeur TTL et de la commande Ping

Commandes importantes pour afficher les informations sur le matériel et le système sous Linux

40 "Commande lsof" simple et efficace dans le système Linux

Comment installer et utiliser la commande Ack dans le système Linux

Comment exécuter les packages .run et .bin dans le système Linux