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 une sortie (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 rapportera éventuellement des fenêtres sous la catégorie: "Inconnu". C'est le cas lorsque les fenêtres ont pid 0
(des tkinter
fenêtres, comme des Idle
fenêtres, un Python
IDE). Cependant, leur titre et leur utilisation seront correctement signalés.
L'écran de verrouillage avec la saisie du mot de passe est signalé comme une "fenêtre de saisie nux".
Les pourcentages sont des pourcentages arrondis , ce qui peut occasionnellement entraîner des différences mineures entre le pourcentage de l' application et la somme du pourcentage de sa fenêtre.
Un exemple: si une application a deux fenêtres utilisées, chacune utilisée 0,7%
du temps total, les deux fenêtres rapporteront 1%
chacune ( 0.7
-> arrondie à 1
), tandis que les rapports d'utilisation de l' application1%
( 1.4
-> arrondie à 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 installer
Le script doit xdotool
obtenir les informations de la fenêtre
sudo apt-get install xdotool
Copiez le script dans un fichier vide, enregistrez-le sous window_logs.py
Testez- exécutez 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 contenant les premiers résultats ~/.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'horodatage 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éé.
Si tout fonctionne bien, ajoutez aux 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 (in nautilus
) Ctrl+ Hpour le rendre visible.
En l'état, le script arrondit l'activité de la fenêtre sur 5 secondes, en supposant que moins de 5 secondes n'utilise pas vraiment la fenêtre. Si vous souhaitez modifier la valeur, définissez-la dans la tête du script dans la ligne:
# -- set update/round time (seconds)
period = 5
# --
Le script est extrêmement "faible en jus". De plus, comme les mises à jour temporelles par fenêtre sont effectuées à l'intérieur du script, le nombre de lignes dans le fichier journal est limité au nombre réel de fenêtres utilisées.
Néanmoins, je n'exécuterais pas le script pendant des semaines d'affilée par exemple, pour éviter d'accumuler trop de lignes (= enregistrements de fenêtre) à maintenir.