Je veux exécuter une commande lorsque l'utilisateur devient inactif (le système est inactif). Par exemple:
echo "You started to be inactive."
Aussi, lorsque l'utilisateur redevient actif (le système n'est plus inactif):
echo "You started to be active, again."
J'ai besoin d'un script shell qui fera cela. Est-ce possible sans minuterie / intervalle? Peut-être certains événements système?
Réponses:
Ce fil sur les forums ArchLinux contient un court programme C qui interroge xscreensaver pour savoir depuis combien de temps l'utilisateur est inactif, cela semble assez proche de vos besoins:
Enregistrez-le sous
getIdle.c
et compilez avecpour 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:Cela nécessite toujours un sondage régulier, mais il fait tout ce dont vous avez besoin ...
la source
xprintidle
, qui est disponible dans la plupart des distributions et fait exactement la même chose.TMOUT en bash mettra fin à une session interactive après le nombre de secondes défini. Vous pouvez utiliser ce mécanisme.
Vous migrez 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.
la source
$TMOUT
secondes écoulées.EXIT
piège ou à partir de.bash_logout
.Ce n'est pas tout à fait ce que vous avez demandé, mais il y a toujours la
batch
commande-(généralement une invocation spéciale de laat
commande-et l'utilisation duatd
-daemon).batch
vous permet d'indiquer une commande à exécuter lorsque la charge moyenne chute en dessous d'une certaine limite (généralement 1,5, mais cela peut être défini au démarrageatd
). Avec,at
il est également possible d'indiquer un travail de telle manière qu'au lieu d'être exécuté à un certain moment; le travail est simplement livrébatch
à ce moment-là et est d'abord exécuté lorsque la moyenne de charge chute (par exemple, il est exécuté dès que la moyenne de charge tombe en dessous de 1,5 quelque temps après 2h00 du matin).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 emprunter la voie de programmation (à laquelle elle ressemble à partir des autres réponses), je pense que j'essaierais de créer quelque chose de similaire au
atd
ou auxcrond
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.la source
.lock
fichiers, vous pouvez facilement gérer les problèmes de synchronisation.Ce fil a quelques solutions basées sur la détection de l'activité du clavier et de la souris. Je cours
xprintidle
depuis un travail cron qui démarre toutes les quelques minutes. Mais comme ils le soulignentxprintidle
n'est pas entretenu, vous pouvez donc installer le module Perl et l'utiliser à la place:J'utiliserais l'une ou l'autre solution en interrogeant Cron, dans un script qui se termine en haut si l'interface utilisateur n'a pas été suffisamment inactive. Bien sûr, le script aurait besoin d'un
export DISPLAY=:0.0
pour parler à X11.N'oubliez pas que votre clavier et votre souris peuvent être inactifs lorsque vous regardez un film ou exécutez une tâche gourmande en CPU.
la source
Je ne connais pas de moyen de le faire sans interroger une sorte de statistiques système, comme les autres réponses utilisent un économiseur d'écran ou une minuterie inactive bash, ou en cours d'exécution à partir de .bash_logout, mais voici une idée pour vérifier l'utilisation du processeur.
Cela impliquerait toujours l'interrogation toutes les n secondes, et si votre utilisation du processeur est inférieure à la quantité que vous choisissez, vous pouvez alors écrire ce que vous voulez exécuter. Cependant, tout ce que vous exécutez pourrait augmenter l'utilisation du processeur, mais vous pouvez utiliser nice sur votre "truc" pour ne pas le compter.
Voici un script de test utilisant top, mais vous pouvez utiliser mpstat à la place ou vérifier les moyennes de charge à la place?
C'est juste un script que j'ai jeté ensemble pour tester la lecture du ralenti par le haut. Vous pouvez analyser,
/proc/stat
mais je pense que cela ne montre que les temps totaux, et vous auriez besoin de comparer les résultats sur un intervalle. Top a son propre problème pour moi (Linux Mint 16), lors de la première exécution, il ne semble jamais changer les cpustats, comme s'il devait attendre pour analyser / proc / stat lui-même, d'où letop -bn2
mais en théorietop -bn1
devrait fonctionner.la source
w
commande qui affiche le temps d'inactivité de l'utilisateur. - Au fait, je ne juge pas, c'est juste que pour moi, je veux détecter le ralenti pour mettre la machine en veille, pour économiser de l'énergie, et l'interrogation va à l'encontre de cela.