Il existe un script de suivi du temps d'utilisation de l'application, que Jacob Vlijm a écrit dans une autre question. https://askubuntu.com/a/780542/6548
En raison de la petite réputation, je ne peux pas commenter là-bas. Je vais donc demander ici s'il est possible de trier les entrées par pourcentage d'utilisation plutôt que par ordre relatif actuel.
Voici un script au cas où vous ne voudriez pas vérifier la question initiale.
#!/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
J'ai édité le script pour produire des rapports triés, croissants ou décroissants, à définir dans la tête du script.
Le tri s'effectue à la fois dans l'ordre des applications et de leurs fenêtres (dans les sous-listes par application).
#!/usr/bin/env python3
import subprocess
import time
import os
from operator import itemgetter
# -- set update/round time (seconds)
period = 5
# -- set sorting order. up = most used first, use either "up" or "down"
order = "up"
# 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]) # total time
report.write("")
alldata = []
for app in applist:
appdata = []; windata = []
apptime = sum([it[2] for it in winlist if it[0] == app])
appperc = round(100*apptime/totaltime)
for d in [app, apptime, appperc]:
appdata.append(d)
wins = [r for r in winlist if r[0] == app]
for w in wins:
wperc = str(round(100*w[2]/totaltime))
windata.append([w[1], w[2], wperc])
windata = sorted(windata, key=itemgetter(1))
windata = windata[::-1] if order == "up" else windata
appdata.append(windata); alldata.append(appdata)
alldata = sorted(alldata, key = itemgetter(1))
alldata = alldata[::-1] if order == "up" else alldata
for item in alldata:
app = item[0]; apptime = item[1]; appperc = item[2]
report.write(
("-"*60)+"\n"+app+"\n"+time_format(apptime)\
+" ("+str(appperc)+"%)\n"+("-"*60)+"\n"
)
for w in item[3]:
wname = w[0]; time = w[1]; perc = w[2]
report.write(
" "+time_format(time)+" ("+perc+"%)"\
+(6-len(perc))*" "+wname+"\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
Il produit une sortie comme:
------------------------------------------------------------
firefox
0:08:25 (97%)
------------------------------------------------------------
0:06:50 (79%) Sort by percentage of use in a python script - Ask Ubuntu - Mozilla Firefox
0:01:30 (17%) scripts - Is there software which time- tracks window & application usage? - Ask Ubuntu - Mozilla Firefox
0:00:05 (1%) Ask Ubuntu General Room | chat.stackexchange.com - Mozilla Firefox
------------------------------------------------------------
gedit
0:00:10 (2%)
------------------------------------------------------------
0:00:10 (2%) 2017_02_15_20_47_10.txt (~/.usagelogs) - gedit
------------------------------------------------------------
zenity
0:00:05 (1%)
------------------------------------------------------------
0:00:05 (1%) Paste snippets
============================================================
started: 2017-02-15 20:58:19 updated: 2017-02-15 21:07:03
============================================================
Le script a besoin de xdotool
pour obtenir les informations de la fenêtre
Sudo apt-get install xdotool
Copiez le script dans un fichier vide, enregistrez-le sous le nom window_logs.py
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éé.
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"
Pour inverser l'ordre de tri, changez simplement l'argument dans la tête du script:
# -- set sorting order. up = most used first, use either "up" or "down"
order = "up"
NB Veuillez lire les notes et Plus de notes dans les sections réponse liée !