Gibt es eine Software, die meine Aktivitäten aufzeichnet und einen Bericht erstellt?
Basierend auf dem fokussierten Fenster und dem Fenstertitel.
Der Bericht zeigt nur die für ein bestimmtes Fenster aufgewendete Zeit und seinen Titel wie:
Application Title Time
Firefox Ask Ubuntu - Mozilla Firefox 5:58
Akzeptierte Antwort:
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.
Notizen
-
Der Bericht wird möglicherweise Fenster unter der Kategorie „Unbekannt“ melden. Dies ist der Fall, wenn Windows
pid 0
hat (tkinter
Windows, wie z. B.Idle
Windows, einPython
IDE). Ihr Fenstertitel und ihre Verwendung werden jedoch korrekt gemeldet. -
Der Sperrbildschirm mit Passworteingabe wird als „nux input window“ gemeldet.
-
Die Prozentangaben sind gerundet Prozentangaben, was gelegentlich zu geringfügigen Unterschieden zwischen den Anwendungen führen kann Prozentsatz und die Summe der Prozentsätze seines Fensters.
Ein Beispiel:Wenn eine Anwendung zwei Fenster verwendet, verwendet jedes
0,7%
der Gesamtzeit beide Fenster wird1%
melden jeweils (0.7
–> auf1
gerundet ), während die Anwendung Nutzung meldet1%
(1.4
–> auf1
gerundet )Keine Notwendigkeit zu sagen, dass diese Unterschiede im Gesamtbild 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
Einrichtung
-
Das Skript benötigt
xdotool
um die Fensterinformationen abzurufensudo apt-get install xdotool
-
Kopieren Sie das Skript in eine leere Datei und speichern Sie es als
window_logs.py
-
Testen Sie das Skript:Starten Sie das Skript mit dem Befehl (von einem Terminal):
python3 /path/to/window_logs.py
Nach einer Minute erstellt das Skript eine Protokolldatei mit den ersten Ergebnissen in
~/.usagelogs
. Die Datei erhält einen Zeitstempel mit Erstellungsdatum und -zeit. 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 verstrichen ist.
Wenn das Skript neu gestartet wird, wird eine neue Datei mit einem neuen (Start-)Zeitstempel erstellt.
-
Wenn alles funktioniert, fügen Sie es zu Startup Applications hinzu:Dash> Startup Applications> Add. 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 (innautilus
) Strg +H um es sichtbar zu machen.-
So wie es ist, rundet das Skript 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 Drehbuch ist extrem „saftarm“. Außerdem wird die Zeit pro Fenster aktualisiert innerhalb des Skripts 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 zum Beispiel nicht wochenlang hintereinander ausführen, um zu verhindern, dass sich zu viele Zeilen (=Fensterdatensätze) ansammeln, die gewartet werden müssen.