BEARBEITEN: Eine Version des Skripts mit sortierten Berichten finden Sie hier
Es macht immer Spaß, ein Skript dafür zu schreiben!
Das folgende Skript erzeugt eine Ausgabe (Bericht) wie:
------------------------------------------------------------
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
============================================================
..die einmal pro Minute aktualisiert wird.
Anmerkungen
Der Bericht meldet möglicherweise Fenster unter der Kategorie "Unbekannt". Dies ist der Fall, wenn Windows pid 0
( tkinter
Fenster wie Idle
Windows, eine Python
IDE) haben. Ihr Fenstertitel und ihre Verwendung werden jedoch korrekt gemeldet.
Der Sperrbildschirm mit Passworteingabe wird als "Nux-Eingabefenster" gemeldet.
Die Prozentsätze sind gerundete Prozentsätze, die gelegentlich zu geringfügigen Unterschieden zwischen dem Prozentsatz der Anwendung und der Summe des Prozentsatzes des Fensters führen können.
Ein Beispiel: Wenn für eine Anwendung zwei Fenster verwendet werden, die jeweils 0,7%
für die Gesamtzeit verwendet werden, melden beide Fenster1%
jeweils ( 0.7
-> gerundet auf 1
), während die Nutzungsberichte der Anwendung1%
( 1.4
-> gerundet auf 1
).
Man muss nicht sagen, dass diese Unterschiede im ganzen Bild völlig irrelevant sind.
Das Skript
#!/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
Wie stellt man das ein
Das Skript muss xdotool
die Informationen des Fensters abrufen
sudo apt-get install xdotool
Kopieren Sie das Skript in eine leere Datei und speichern Sie es unter window_logs.py
Testen Sie das Skript: Starten Sie das Skript mit dem Befehl (von einem Terminal aus):
python3 /path/to/window_logs.py
Nach einer Minute erstellt das Skript eine Protokolldatei mit den ersten Ergebnissen in ~/.usagelogs
. Die Datei ist mit dem Erstellungsdatum und der Erstellungszeit versehen. Die Datei wird einmal pro Minute aktualisiert.
Am Ende der Datei sehen Sie sowohl die Startzeit als auch den Zeitstempel der letzten Bearbeitung. Auf diese Weise können Sie immer sehen, wie lange die Datei dauert.
Wenn das Skript neu gestartet wird, wird eine neue Datei mit einem neuen (Start-) Zeitstempel erstellt.
Wenn alles einwandfrei funktioniert, fügen Sie Startanwendungen hinzu: Dash> Startanwendungen> Hinzufügen. Fügen Sie den Befehl hinzu:
/bin/bash -c "sleep 15 && python3 /path/to/window_logs.py"
Weitere Notizen
~/.uselogs
ist standardmäßig ein verstecktes Verzeichnis. Drücken Sie (in nautilus
) Ctrl+ H, um es sichtbar zu machen.
Das Skript rundet die Aktivität des Fensters auf 5 Sekunden ab, vorausgesetzt, weniger als 5 Sekunden verwenden das Fenster nicht wirklich. Wenn Sie den Wert ändern möchten, setzen Sie ihn im Kopf des Skripts in der Zeile:
# -- set update/round time (seconds)
period = 5
# --
Das Skript ist extrem "saftarm". Da die Zeitaktualisierungen pro Fenster im Skript durchgeführt werden, ist die Anzahl der Zeilen in der Protokolldatei auf die tatsächliche Anzahl der verwendeten Fenster begrenzt.
Trotzdem würde ich das Skript beispielsweise nicht wochenlang hintereinander ausführen, um zu verhindern, dass sich zu viele Zeilen (= Fensterdatensätze) ansammeln, um sie zu verwalten.