web-dev-qa-db-fra.com

Existe-t-il un logiciel permettant de suivre l'utilisation de la fenêtre et des applications?

Existe-t-il un logiciel qui garde le temps de mes activités et donne un rapport? Basé sur la fenêtre ciblée et le titre de la fenêtre. Le rapport montrerait simplement le temps passé pour une fenêtre spécifique et son titre comme:

Application   Title                             Time
Firefox       Ask Ubuntu - Mozilla Firefox      5:58
10
ambi

EDIT: une version du script avec des rapports triés peut être trouvée ici


Toujours amusant d'écrire un script pour ça!

Le script ci-dessous produira un résultat (rapport) comme:

------------------------------------------------------------
nautilus
0:00:05 (3%)
------------------------------------------------------------
   0:00:05 (3%)     .usagelogs
------------------------------------------------------------
firefox
0:01:10 (36%)
------------------------------------------------------------
   0:00:05 (3%)     The Asker or the Answerer? - Ask Ubuntu Meta - Mozilla Firefox
   0:00:15 (8%)     scripts - Is there software which time- tracks window & application usage? - Ask Ubuntu - Mozilla Firefox
   0:00:10 (5%)     Ask Ubuntu - Mozilla Firefox
   0:00:15 (8%)     Why is a one line non-understandable answer used as review audit? - Ask Ubuntu Meta - Mozilla Firefox
   0:00:20 (10%)    bash - How to detect the number of opened terminals by the user - Ask Ubuntu - Mozilla Firefox
   0:00:05 (3%)     BlueGriffon - Mozilla Firefox
------------------------------------------------------------
gedit
0:02:00 (62%)
------------------------------------------------------------
   0:02:00 (62%)    2016_06_04_10_33_29.txt (~/.usagelogs) - gedit

============================================================
started: 2016-06-04 10:33:29    updated: 2016-06-04 10:36:46
============================================================


.. qui est mis à jour une fois par minute.

Remarques

  • Le rapport signalera éventuellement des fenêtres dans la catégorie: "Inconnu". C'est le cas lorsque les fenêtres ont pid 0 (tkinter fenêtres, telles que Idle fenêtres, aPython IDE). Le titre de leur fenêtre et leur utilisation seront signalés correctement.

  • L'écran de verrouillage avec saisie du mot de passe est signalé par une "fenêtre de saisie Nux".

  • Les pourcentages sont arrondis , ce qui peut parfois entraîner des différences mineures entre les applications . -) pourcentage et la somme du pourcentage de sa fenêtre.

    Un exemple: si une application utilise deux fenêtres, chacune ayant utilisé 0,7% du temps total, les deux fenêtres afficheront 1% chacun (0.7 -> arrondi à 1), tandis que les rapports d'utilisation de l'application 1% (1.4 -> arrondi à 1)

    Inutile de dire que ces différences sont totalement hors de propos dans l’ensemble.

Le scénario

#!/usr/bin/env python3
import subprocess
import time
import os

# -- set update/round time (seconds)
period = 5
# -- 
# don change anything below
home = os.environ["HOME"]
logdir = home+"/.usagelogs"

def currtime(tformat=None):
    return time.strftime("%Y_%m_%d_%H_%M_%S") if tformat == "file"\
           else time.strftime("%Y-%m-%d %H:%M:%S")

try:
    os.mkdir(logdir)
except FileExistsError:
    pass

# path to your logfile
log = logdir+"/"+currtime("file")+".txt"; startt = currtime()

def get(command):
    try:
        return subprocess.check_output(command).decode("utf-8").strip()
    except subprocess.CalledProcessError:
        pass

def time_format(s):
    # convert time format from seconds to h:m:s
    m, s = divmod(s, 60); h, m = divmod(m, 60)
    return "%d:%02d:%02d" % (h, m, s)

def summarize():
    with open(log, "wt" ) as report:
        totaltime = sum([it[2] for it in winlist])
        report.write("")
        for app in applist:
            wins = [r for r in winlist if r[0] == app]
            apptime = sum([it[2] for it in winlist if it[0] == app])
            appperc = round(100*apptime/totaltime)
            report.write(("-"*60)+"\n"+app+"\n"+time_format(apptime)+\
                         " ("+str(appperc)+"%)\n"+("-"*60)+"\n")
            for w in wins:
                wperc = str(round(100*w[2]/totaltime))
                report.write("   "+time_format(w[2])+" ("+\
                             wperc+"%)"+(6-len(wperc))*" "+w[1]+"\n")
        report.write("\n"+"="*60+"\nstarted: "+startt+"\t"+\
                     "updated: "+currtime()+"\n"+"="*60)

t = 0; applist = []; winlist = []
while True:
    time.sleep(period)
    frpid = get(["xdotool", "getactivewindow", "getwindowpid"])
    frname = get(["xdotool", "getactivewindow", "getwindowname"])
    app = get(["ps", "-p", frpid, "-o", "comm="]) if frpid != None else "Unknown"
    # fix a few names
    if "gnome-terminal" in app:
        app = "gnome-terminal"
    Elif app == "soffice.bin":
        app = "libreoffice"
    # add app to list
    if not app in applist:
        applist.append(app)
    checklist = [item[1] for item in winlist]
    if not frname in checklist:
        winlist.append([app, frname, 1*period])
    else:
        winlist[checklist.index(frname)][
            2] = winlist[checklist.index(frname)][2]+1*period
    if t == 60/period:
        summarize()
        t = 0
    else:
        t += 1

Comment mettre en place

  1. Le script a besoin de xdotool pour obtenir les informations de la fenêtre

    Sudo apt-get install xdotool
    
  2. Copiez le script dans un fichier vide, enregistrez-le sous le nom window_logs.py

  3. Tester le script: lancez le script par la commande (depuis un terminal):

    python3 /path/to/window_logs.py
    

    Après une minute, le script crée un fichier journal avec les premiers résultats dans ~/.usagelogs. Le fichier est horodaté avec la date et l'heure de création. Le fichier est mis à jour une fois par minute.

    Au bas du fichier, vous pouvez voir à la fois l'heure de début et l'heure de la dernière modification. De cette façon, vous pouvez toujours voir quelle est la durée du fichier.

    Si le script redémarre, un nouveau fichier avec un nouvel horodatage (de début) est créé.

  4. Si tout fonctionne correctement, ajoutez à Applications de démarrage: Dash> Applications de démarrage> Ajouter. Ajoutez la commande:

    /bin/bash -c "sleep 15 && python3 /path/to/window_logs.py"
    

Plus de notes

  • ~/.uselogs est un répertoire caché par défaut. Appuyez sur (dans nautilusCtrl+H pour le rendre visible.
  • Dans l’état actuel des choses, le script arrondit l’activité de la fenêtre pendant 5 secondes, en supposant que moins de 5 secondes n’utilisent pas vraiment la fenêtre. Si vous souhaitez modifier la valeur, définissez-la dans l'en-tête du script dans la ligne:

    # -- set update/round time (seconds)
    period = 5
    # -- 
    
  • Le script est extrêmement "faible en jus". De plus, étant donné que les mises à jour temporelles par fenêtre sont effectuées dans le script, le nombre de lignes dans le fichier journal est limité au nombre réel de fenêtres utilisées. .

    Néanmoins, je ne lancerais pas le script plusieurs semaines d'affilée, par exemple, pour éviter d'accumuler trop de lignes (= enregistrements de fenêtre) à conserver.

7
Jacob Vlijm

il y a arbtt qui fait exactement ce que vous décrivez: https://www.joachim-breitner.de/blog/336-The_Automatic_Rule-Based_Time_Tracker

3
mnagel