Czy istnieje oprogramowanie, które śledzi użycie okna i aplikacji?

10

Czy istnieje oprogramowanie, które utrzymuje czas moich działań i daje raport? Na podstawie skoncentrowanego okna i tytułu okna. Raport pokaże tylko czas poświęcony na określone okno i jego tytuł, taki jak:

Application   Title                             Time
Firefox       Ask Ubuntu - Mozilla Firefox      5:58
ambi
źródło
1
W centrum oprogramowania znajduje się moduł do śledzenia czasu
Mateo
1
Można to zrobić niezwykle łatwo za pomocą dostępnych programów - nie przypisujmy do tego motywu, wcześniej użyłem takiego programu do nagrywania własnego czasu na projekcie. Z pewnością nie należy to do kategorii „zbyt szerokiej”
Mateo
W każdym razie nie rozumiem, dlaczego to pytanie jest mocno odrzucane. To normalne i jasne pytanie. Nigdzie na stronie nie widziałem ostrzeżenia „zadaj tylko pytanie, na które nikt nie zna odpowiedzi”.
Jacob Vlijm
Cześć Ambi. Wysłałem moją odpowiedź. Daj mi znać, jeśli dasz radę!
Jacob Vlijm
Tak, być może mój opis był nieprawidłowy - nie chcę szpiegować nikogo oprócz mnie. Chcę mieć statystyki dotyczące tego, co zmarnowałem swój czas. Sprawdziłem „Przegląd śledzenia czasu” i „Śledzenie czasu GTimeLog”, ale tam musisz wprowadzić wszystko ręcznie - czego nie chcę robić. Jacob Vlijm, dziękuję, właśnie tego szukałem, z wyjątkiem tego, że myślałem, że istnieje takie oprogramowanie z GUI
ambi

Odpowiedzi:

8

EDYCJA: wersję skryptu z posortowanymi raportami można znaleźć tutaj


Zawsze fajnie jest napisać dla niego skrypt!

Poniższy skrypt wygeneruje dane wyjściowe (raport), takie jak:

------------------------------------------------------------
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
============================================================


.. który jest aktualizowany raz na minutę.

Notatki

  • Raport prawdopodobnie zgłosi okna w kategorii: „Nieznany”. Dzieje się tak, gdy okna mają pid 0( tkinterokna, takie jak IdleWindows, PythonIDE). Jednak tytuł okna i użycie zostaną poprawnie zgłoszone.

  • Ekran blokady z wprowadzonym hasłem jest zgłaszany jako „okno wprowadzania Nux”.

  • Wartości procentowe są zaokrąglonymi wartościami procentowymi, co czasami może prowadzić do niewielkich różnic między procentem aplikacji a sumą procentu okna.

    Przykład: jeśli w aplikacji są używane dwa okna, z których każde wykorzystuje 0,7%całkowity czas, oba okna będą raportować 1%każde ( 0.7-> zaokrąglone do 1), podczas gdy raporty użytkowania aplikacji1% ( 1.4-> zaokrąglone do 1)

    Nie trzeba mówić, że różnice te są całkowicie nieistotne w całym obrazie.

Scenariusz

#!/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

Jak skonfigurować

  1. Skrypt musi xdotooluzyskać informacje o oknie

    sudo apt-get install xdotool
  2. Skopiuj skrypt do pustego pliku i zapisz go jako window_logs.py

  3. Testuj - uruchom skrypt: tartuj skrypt za pomocą komendy (z terminala):

    python3 /path/to/window_logs.py

    Po minucie skrypt tworzy plik dziennika z pierwszymi wynikami ~/.usagelogs. Plik jest opatrzony datą i godziną utworzenia. Plik jest aktualizowany raz na minutę.

    Na dole pliku widać zarówno czas rozpoczęcia, jak i znacznik czasu ostatniej edycji. W ten sposób zawsze możesz zobaczyć, jaki jest czas trwania pliku.

    Jeśli skrypt uruchomi się ponownie, tworzony jest nowy plik z nowym (początkowym) znacznikiem czasu.

  4. Jeśli wszystko działa poprawnie, dodaj do Startup Applications: Dash> Startup Applications> Add. Dodaj polecenie:

    /bin/bash -c "sleep 15 && python3 /path/to/window_logs.py"

Więcej notatek

  • ~/.uselogsjest domyślnie ukrytym katalogiem. Naciśnij (in nautilus) Ctrl+, Haby było widoczne.
  • W tej chwili skrypt zaokrągla aktywność okna na 5 sekund, zakładając, że mniej niż 5 sekund tak naprawdę nie używa okna. Jeśli chcesz zmienić wartość, ustaw ją w nagłówku skryptu w wierszu:

    # -- set update/round time (seconds)
    period = 5
    # -- 
  • Skrypt ma bardzo niski poziom soku. Ponadto, ponieważ aktualizacje czasu na okno są wykonywane wewnątrz skryptu, liczba wierszy w pliku dziennika jest ograniczona do faktycznej liczby używanych okien.

    Niemniej jednak nie uruchamiałbym skryptu na przykład przez kilka tygodni z rzędu, aby zapobiec gromadzeniu zbyt wielu wierszy (= rekordów okna) do utrzymania.

Jacob Vlijm
źródło
1
Dokładnie to, czego szukałem, oprócz tego, że dobrze jest mieć również GUI, ale mogę to zrobić sam. Dziękuję Ci.
ambi