EDITAR: una versión del script con informes ordenados se puede encontrar aquí
¡Siempre es divertido escribir un guión para ello!
El siguiente script producirá una salida (informe) como:
------------------------------------------------------------
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
============================================================
..que se actualiza una vez por minuto.
Notas
El informe posiblemente informará ventanas en la categoría: "Desconocido". Este es el caso cuando las ventanas tienen pid 0
( tkinter
ventanas, como Idle
ventanas, un Python
IDE). Sin embargo, su título de ventana y uso se informarán correctamente.
La pantalla de bloqueo con entrada de contraseña muestra una "ventana de entrada nux".
Los porcentajes son porcentajes redondeados , que ocasionalmente pueden ocasionar diferencias menores entre el porcentaje de la aplicación y la suma del porcentaje de su ventana.
Un ejemplo: si una aplicación tiene dos ventanas utilizadas, cada una 0,7%
de las cuales utiliza el tiempo total, ambas ventanas informarán 1%
cada una ( 0.7
-> redondeada a 1
), mientras que el uso de la aplicación informa 1%
( 1.4
-> redondeada a 1
)
No es necesario decir que estas diferencias son totalmente irrelevantes en todo el panorama.
La secuencia de comandos
#!/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
Como instalar
El script necesita xdotool
obtener la información de la ventana.
sudo apt-get install xdotool
Copie el script en un archivo vacío, guárdelo como window_logs.py
Prueba: ejecute la secuencia de comandos: agregue la secuencia de comandos mediante el comando (desde un terminal):
python3 /path/to/window_logs.py
Después de un minuto, el script crea un archivo de registro con los primeros resultados ~/.usagelogs
. El archivo está marcado con la fecha y hora de creación. El archivo se actualiza una vez por minuto.
En la parte inferior del archivo, puede ver tanto la hora de inicio como la marca de tiempo de la última edición. De esta manera, siempre puede ver cuál es el período de tiempo del archivo.
Si el script se reinicia, se crea un nuevo archivo con una nueva marca de tiempo (inicio).
Si todo funciona bien, agréguelo a Aplicaciones de inicio: Tablero> Aplicaciones de inicio> Agregar. Agrega el comando:
/bin/bash -c "sleep 15 && python3 /path/to/window_logs.py"
Más notas
~/.uselogs
es un directorio oculto por defecto. Presione (in nautilus
) Ctrl+ Hpara hacerlo visible.
Tal como está, el guión redondea la actividad de la ventana en 5 segundos, suponiendo que menos de 5 segundos realmente no esté usando la ventana. Si desea cambiar el valor, configúrelo en el encabezado del script en la línea:
# -- set update/round time (seconds)
period = 5
# --
El guión es extremadamente "bajo en jugo". Además, dado que las actualizaciones de tiempo por ventana se realizan dentro del script, el número de líneas en el archivo de registro se limita al número real de ventanas utilizadas.
Sin embargo, no ejecutaría el script durante semanas seguidas, por ejemplo, para evitar acumular demasiadas líneas (= registros de ventana) para mantener.