EDIT: versi skrip dengan laporan yang diurutkan dapat ditemukan di sini
Selalu menyenangkan untuk menulis skrip untuk itu!
Script di bawah ini akan menghasilkan output (laporan) seperti:
------------------------------------------------------------
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
============================================================
..yang diperbarui sekali per menit.
Catatan
Laporan mungkin akan melaporkan windows di bawah kategori: "Tidak Dikenal". Ini adalah kasus ketika windows memiliki pid 0
( tkinter
windows, seperti Idle
windows, Python
IDE). Judul jendela dan penggunaannya akan dilaporkan dengan benar.
Layar kunci dengan input kata sandi dilaporkan "jendela input nux".
Persentase adalah persentase bulat , yang kadang-kadang dapat menyebabkan perbedaan kecil antara persentase aplikasi dan jumlah persentase window-nya.
Contoh: Jika aplikasi memiliki dua jendela yang digunakan, masing-masing digunakan 0,7%
dari total waktu, kedua jendela akan melaporkan 1%
masing-masing ( 0.7
-> dibulatkan ke 1
), sedangkan laporan penggunaan aplikasi1%
( 1.4
-> dibulatkan ke 1
)
Tidak perlu dikatakan bahwa perbedaan-perbedaan ini sama sekali tidak relevan dalam keseluruhan gambaran.
Naskah
#!/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
Cara mengatur
Script perlu xdotool
mendapatkan informasi jendela
sudo apt-get install xdotool
Salin skrip ke file kosong, simpan sebagai window_logs.py
Tes-jalankan skrip: tart skrip dengan perintah (dari terminal):
python3 /path/to/window_logs.py
Setelah satu menit, skrip membuat file log dengan hasil pertama di ~/.usagelogs
. File ini ditandai dengan tanggal & waktu pembuatan. File diperbarui sekali per menit.
Di bagian bawah file, Anda dapat melihat waktu mulai dan cap waktu hasil edit terakhir. Dengan cara ini Anda selalu dapat melihat berapa rentang waktu file.
Jika skrip dimulai ulang, file baru dengan cap waktu baru (mulai-) dibuat.
Jika semua berfungsi dengan baik, tambahkan ke Aplikasi Startup: Dash> Aplikasi Startup> Tambah. Tambahkan perintah:
/bin/bash -c "sleep 15 && python3 /path/to/window_logs.py"
Lebih banyak catatan
~/.uselogs
adalah direktori tersembunyi secara default. Tekan (dalam nautilus
) Ctrl+ Huntuk membuatnya terlihat.
Seperti itu, skrip membulatkan keaktifan jendela pada 5 detik, dengan asumsi kurang dari 5 detik tidak benar-benar menggunakan jendela. Jika Anda ingin mengubah nilainya, atur di bagian atas skrip di baris:
# -- set update/round time (seconds)
period = 5
# --
Skripnya sangat "rendah jus". Selain itu, karena pembaruan waktu per jendela dilakukan di dalam skrip, jumlah baris dalam file log terbatas pada jumlah aktual jendela yang digunakan.
Namun demikian, saya tidak akan menjalankan skrip selama berminggu-minggu misalnya, untuk mencegah akumulasi terlalu banyak baris (= catatan jendela) untuk dikelola.