web-dev-qa-db-fra.com

Moyen de mesurer l'utilisation de l'ordinateur via un économiseur d'écran temps actif / inactif?

Je cherche un moyen simple de déterminer le temps approximatif que je passe par jour sur un ordinateur. Cela peut s'avérer une tâche difficile si vous essayez de surveiller les processus, les appuis sur les touches, les clics de souris, etc., car on peut faire quelque chose: penser à un problème de codage, lire un article sur le Web, parler au téléphone ou partir à l'aventure. chien. L'ordinateur ne peut pas lire dans mes pensées. Étant donné que je laisse les ordinateurs allumés 24 heures sur 24, 7 jours sur 7, les connexions de surveillance ne fonctionnent pas.

J'ai eu l'idée de consigner combien de temps l'ordinateur passe en mode économiseur d'écran. Mon erreur ne serait alors pas plus grande que le produit du délai d'inactivité d'un économiseur d'écran avec le nombre de fois qu'il passe en mode économiseur d'écran. En soustrayant ce chiffre à 24 heures, cela me donnerait une estimation raisonnable pour mes besoins.

Le problème est le suivant: je ne sais pas comment me connecter lorsque l'économiseur d'écran est activé ou désactivé. J'utilise actuellement Ubuntu 10.10 sur la plupart des machines, sur le point de passer à la version 11.04 sur certaines d’entre elles.

Des idées?

Après plusieurs recherches sur Google, je suis tombé sur le moniteur dbus qui semblait pouvoir fonctionner, mais il manque un ingrédient important. Voici le script que je lance qui lance le moniteur en tant que démon:

#!/bin/bash
RUNNING=`ps -A | grep "dbus-monitor"`
if [ ! $RUNNING  ]; then
    echo "(Re)starting dbus-monitor daemon"
    Nohup dbus-monitor "--profile" "type='signal',interface='org.gnome.ScreenSaver'" >> ${HOME}/sc.log &
fi

Voici la sortie qu'il produit après avoir verrouillé et déverrouillé l'écran plusieurs fois:

sig     1304860712      153829  2       /org/freedesktop/DBus   org.freedesktop.DBus    NameAcquired
sig     1304860717      318732  462     /org/gnome/ScreenSaver  org.gnome.ScreenSaver   ActiveChanged
sig     1304860725      547928  463     /org/gnome/ScreenSaver  org.gnome.ScreenSaver   ActiveChanged
sig     1304861018      17      464     /org/gnome/ScreenSaver  org.gnome.ScreenSaver   ActiveChanged
sig     1304862919      403523  466     /org/gnome/ScreenSaver  org.gnome.ScreenSaver   ActiveChanged

La deuxième colonne est évidemment unix UTC en secondes. L'ingrédient manquant est qu'il ne précise pas si l'économiseur d'écran est activé ou non! Je suppose que je pourrais supposer qu'ils basculent entre le moment où NameAcquired est arrivé, mais cela me laisse mal à l’aise qu’il puisse y avoir un événement manquant ou supplémentaire que je ne peux pas anticiper et qui pourrait tout mettre en désordre.

Beaucoup obligé pour des idées.

jkcunningham

14
jkcunningham

Je voudrais remercier et contribuer en retour un script simple et brut (qui peut être amélioré), le mettre sur les applications de démarrage avec:

xterm -e logSessionLock.sh

il est également préparé pour une panne ou une panne du système. Ce n'est pas lourdement testé ... mais fonctionne très bien jusqu'à maintenant. il créera 2 fichiers, un dans $ HOME (le journal), un autre dans/tmp (solution de contournement du système)

logSessionLock.sh

#!/bin/bash

logFile="."`basename $0`".log"

function FUNClog {
  strTime=`gnome-screensaver-command --time`
  strDate=`date +"%Y%m%d-%H%M%S"`
  strLog="$strDate ($1) $strTime"
}

function FUNCwriteLog {
  echo $strLog >>$HOME/$logFile
  echo $strLog
}

active=false
firstTime=true

# restores last log entry in case of a system crash
strLog=`cat "/tmp/$logFile.tmp"`
FUNCwriteLog
echo "" >"/tmp/$logFile.tmp"
if [[ -n "$strLog" ]]; then #if has something, it was active when the system crashed
  active=true
fi

while true; do 
  if gnome-screensaver-command --query |grep -q "The screensaver is active"; then
    if ! $active; then
      # restore the saved tmp log
      strLog=`cat "/tmp/$logFile.tmp"`
      FUNCwriteLog

      # update log (can be off when this line is reached? once it seem to happen...)
      FUNClog BEGIN
      FUNCwriteLog #logs the begin time

      active=true
    else
      FUNClog ON #stores the ammount of time the screensaver has been ON
      echo $strLog >"/tmp/$logFile.tmp"
    fi
  else
    if $active; then
      FUNCwriteLog #saves the ammount of time the screensaver has been ON

      FUNClog OFF
      FUNCwriteLog
      echo "" >"/tmp/$logFile.tmp"

      active=false
    fi
  fi 

  sleep 1
done

le journal est comme ça:

 20120214-191528 (BEGIN) The screensaver has been active for 0 seconds.
 20120214-193602 (ON) The screensaver has been active for 1234 seconds.
 20120214-193603 (OFF) The screensaver is not currently active.
4
Aquarius Power

Le package " Workrave " non seulement indique si vous utilisez votre ordinateur et vous aide à faire des pauses pendant la journée, mais fournit également un ensemble de statistiques intéressantes, à la fois brutes (dans un fichier texte) et via une interface graphique (Daily usage: 5:41:00 for Jul 21). Les statistiques incluent également des choses comme les minutes d'utilisation de la souris, la distance de déplacement de la souris, les frappes au clavier, etc.

Installez-le à partir des référentiels officiels, ajoutez-le à votre barre de menu, faites un clic droit et choisissez "statistiques". Vous aurez un calendrier pour choisir le jour que vous souhaitez connaître. Ou regardez les données dans ~/.workrave/historystats

3
nealmcb

Si vous supprimez le fichier --profile, vous obtiendrez un horodatage manquant au format, mais le fait que l'écran de veille soit activé ou non.

$ dbus-monitor "type='signal',interface='org.gnome.ScreenSaver'
...
signal sender=:1.46 -> dest=(null destination) serial=1881 path=/org/gnome/ScreenSaver; interface=org.gnome.ScreenSaver; member=ActiveChanged
boolean true

J'ai utilisé une modification de ce script PHP pour activer ou désactiver des éléments basés sur mon économiseur d'écran.

#!/usr/bin/php
<?php
$handle = popen("dbus-monitor 'path=/org/gnome/ScreenSaver, member=ActiveChanged' 2>&1", 'r');
echo "'$handle'; " . gettype($handle) . "\n";
while (!feof($handle)) {
    $read = fgets($handle);
    if(preg_match("/^\s+boolean (\w+)/", $read, $matches))
    {
                $active = ($matches[1] == 'true');
                // do something here
    }
}
pclose($handle);
?>

L'autre option consiste à utiliser gnome-screensaver-command --query. À l'aide de crontab, je laisse Bitcoin utiliser les 4 cœurs lorsque l'économiseur d'écran est activé, mais il ne reçoit qu'un seul cœurs lorsque j'utilise mon ordinateur.

DISPLAY=":0.0"
* * * * * if gnome-screensaver-command --query 2>&1 | grep -q 'is active'; then bitcoind setgenerate true 4; else bitcoind setgenerate true 1; fi

DISPLAY: Sans définir DISPLAY, la commande gnome-screensaver-command ne pourra pas trouver l'écran si elle est exécutée à partir de cron. Cela doit être exécuté avec le même utilisateur connecté.

2>&1: Cela dirige toutes les erreurs dans la sortie standard, qui est capturée par ...

| grep -q 'is active';: le -q rend le grep silencieux, il ne sort rien. Mais la commande renvoie un succès ou un échec utilisé par if.

Je me rends compte qu'aucune de ces solutions ne constitue une solution complète, mais j'espère qu'elles seront suffisantes pour vous aider à démarrer.

2
Asa Ayers

Ceci est un script plus complet. Vous pouvez le déclencher à partir de cron toutes les minutes et si l'économiseur d'écran est actif, il enregistrera combien de temps il est actif. Une fois qu'il est désactivé, il prend la dernière mesure et l'ajoute à ~/Screensaver.log. Si vous l'exécutez à partir de cron, il pourrait être inexact pendant 59 secondes chaque fois que l'économiseur d'écran se désactive.

#!/bin/bash
export DISPLAY=':0'
if gnome-screensaver-command -q 2>&1 | grep -q 'is active'; then
    # this will overwrite the file each time.
    gnome-screensaver-command --time > /tmp/ScreensaverActiveTime
# if the screensaver is not active and we have the file from last time this ran ...
Elif [ -e /tmp/ScreensaverActiveTime ]; then
    # append it to our log and ...
    cat /tmp/ScreensaverActiveTime >> ~/Screensaver.log
    # remove the file. It will be recreated once the screensaver activates again.
    rm /tmp/ScreensaverActiveTime
fi
2
Asa Ayers