Esiste un software che tiene il tempo delle mie attività e fornisce un rapporto?
Basato sulla finestra focalizzata e sul titolo della finestra.
Il rapporto mostrerebbe solo il tempo trascorso per una finestra specifica e il suo titolo come:
Application Title Time
Firefox Ask Ubuntu - Mozilla Firefox 5:58
Risposta accettata:
EDIT:una versione dello script con rapporti ordinati può essere trovato qui
È sempre divertente scrivere una sceneggiatura per questo!
Lo script seguente produrrà un output (report) come:
------------------------------------------------------------
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
============================================================
..che viene aggiornato una volta al minuto.
Note
-
Il report riporterà eventualmente le finestre nella categoria:“Sconosciuto”. Questo è il caso quando Windows ha
pid 0
(tkinter
finestre, comeIdle
windows, unPython
IDE). Tuttavia, il titolo e l'utilizzo della finestra verranno riportati correttamente. -
La schermata di blocco con inserimento password è segnalata come “finestra di inserimento nux”.
-
Le percentuali sono arrotondate percentuali, che potrebbero occasionalmente portare a piccole differenze tra le applicazioni percentuale e la somma della percentuale della sua finestra.
Un esempio:se un'applicazione ha due finestre utilizzate, ciascuna utilizzava
0,7%
del tempo totale, entrambe le finestre riporterà1%
ciascuno (0.7
–> arrotondato a1
), mentre l'applicazione rapporti sull'utilizzo1%
(1.4
–> arrotondato a1
)Non c'è bisogno di dire che queste differenze sono totalmente irrilevanti nell'intero quadro.
Il copione
#!/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
Come configurare
-
Lo script necessita di
xdotool
per ottenere le informazioni della finestrasudo apt-get install xdotool
-
Copia lo script in un file vuoto, salvalo come
window_logs.py
-
Testare lo script:eseguire lo script con il comando (da terminale):
python3 /path/to/window_logs.py
Dopo un minuto, lo script crea un file di registro con i primi risultati in
~/.usagelogs
. Il file è contrassegnato dall'ora con la data e l'ora di creazione. Il file viene aggiornato una volta al minuto.Nella parte inferiore del file, puoi vedere sia l'ora di inizio che il timestamp dell'ultima modifica. In questo modo puoi sempre vedere qual è l'intervallo di tempo del file.
Se lo script si riavvia, viene creato un nuovo file con un nuovo timestamp (di inizio).
-
Se tutto funziona correttamente, aggiungi ad Applicazioni di avvio:Dash> Applicazioni di avvio> Aggiungi. Aggiungi il comando:
/bin/bash -c "sleep 15 && python3 /path/to/window_logs.py"
Altre note
~/.uselogs
è una directory nascosta per impostazione predefinita. Premi (innautilus
) Ctrl +H per renderlo visibile.-
Così com'è, lo script arrotonda l'attività della finestra su 5 secondi, supponendo che meno di 5 secondi non stiano effettivamente utilizzando la finestra. Se desideri modificare il valore, impostalo nell'intestazione dello script nella riga:
# -- set update/round time (seconds) period = 5 # --
-
La sceneggiatura è estremamente "a corto di succo". Inoltre, dal momento che il tempo si aggiorna per finestra vengono eseguiti all'interno dello script, il numero di righe nel file di registro è limitato al numero effettivo di finestre utilizzate.
Tuttavia, non eseguirei lo script per settimane di seguito, ad esempio, per evitare di accumulare troppe righe (=record di finestra) da mantenere.