DÜZENLEME: senaryonun bir versiyonu sıralanmış raporlarla bulunabilir burada
Bunun için bir senaryo yazmak her zaman eğlenceli!
Aşağıdaki komut dosyası aşağıdaki gibi bir çıktı (rapor) üretecektir:
------------------------------------------------------------
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
============================================================
.. dakikada bir güncellenir.
notlar
Rapor muhtemelen "Bilinmeyen" kategorisi altındaki pencereleri rapor edecektir. Bu, pencerelerin pid 0
( pencereler, bir IDE tkinter
gibi Idle
pencereler Python
) olduğu durumdur . Ancak pencere başlıkları ve kullanımları doğru bir şekilde rapor edilecektir.
Şifre girişli kilit ekranında bir "nux giriş penceresi" bildirilir.
Yüzdeler yuvarlatılmış yüzdelerdir, bu da bazen uygulamanın yüzdesi ile pencere yüzdesinin toplamı arasında küçük farklılıklara yol açabilir .
Bir örnek: Bir uygulama kullanılan iki pencere, kullanılan her sahipse 0,7%
toplam zamanın, hem pencereleri bildirir 1%
(her 0.7
-> yuvarlanarak 1
ederken,) uygulamanın kullanım raporları 1%
( 1.4
-> yuvarlanır 1
)
Bu farklılıkların resmin tamamında tamamen alakasız olduğunu söylemeye gerek yoktur.
Senaryo
#!/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
Nasıl kurulur
Komut dosyasının xdotool
pencerenin bilgilerini alması gerekir
sudo apt-get install xdotool
Komut dosyasını boş bir dosyaya kopyalayın, window_logs.py
Komut dosyasını test edin: komutla komutu (terminalden) tartın:
python3 /path/to/window_logs.py
Bir dakika sonra, komut dosyası ilk sonuçları içeren bir günlük dosyası oluşturur ~/.usagelogs
. Dosya, oluşturulma tarihi ve saati ile zaman damgalıdır. Dosya dakikada bir kez güncellenir.
Dosyanın altında, en son düzenlemenin hem başlangıç zamanını hem de zaman damgasını görebilirsiniz. Bu şekilde dosyanın zaman diliminin ne olduğunu her zaman görebilirsiniz.
Komut dosyası yeniden başlatılırsa, yeni (başlangıç) zaman damgalı yeni bir dosya oluşturulur.
Tümü iyi çalışıyorsa Başlangıç Uygulamaları'na ekleyin: Çizgi> Başlangıç Uygulamaları> Ekle. Komutu ekleyin:
/bin/bash -c "sleep 15 && python3 /path/to/window_logs.py"
Diğer notlar
~/.uselogs
varsayılan olarak gizli bir dizindir. Görünür hale getirmek için (in nautilus
) Ctrl+ düğmesine basın H.
Olduğu gibi, komut dosyası pencerenin etkinliğini 5 saniyede yuvarlar, 5 saniyeden daha azının pencereyi gerçekten kullanmadığını varsayar. Değeri değiştirmek isterseniz, satırdaki komut dosyasının başına ayarlayın:
# -- set update/round time (seconds)
period = 5
# --
Senaryo son derece "meyve suyu az" dır. Ayrıca, pencere başına zaman güncellemeleri betiğin içinde yapıldığından, günlük dosyasındaki satır sayısı kullanılan pencerelerin gerçek sayısıyla sınırlıdır.
Yine de, korumak için çok fazla satır (= pencere kayıtları) birikmesini önlemek için örneğin bir hafta boyunca komut dosyası çalıştırmak olmaz.