EDIT: một phiên bản của tập lệnh với các báo cáo được sắp xếp có thể được tìm thấy ở đây
Luôn luôn vui vẻ để viết một kịch bản cho nó!
Kịch bản dưới đây sẽ tạo ra một đầu ra (báo cáo) như:
------------------------------------------------------------
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
============================================================
.. những gì được cập nhật một lần mỗi phút.
Ghi chú
Báo cáo có thể sẽ báo cáo các cửa sổ trong danh mục: "Không biết". Đây là trường hợp khi các cửa sổ có pid 0
( tkinter
cửa sổ, chẳng hạn như Idle
cửa sổ, Python
IDE). Tiêu đề cửa sổ và cách sử dụng của họ sẽ được báo cáo chính xác tuy nhiên.
Màn hình khóa với đầu vào mật khẩu được báo cáo là "cửa sổ nhập nux".
Tỷ lệ phần trăm là tỷ lệ phần trăm được làm tròn , đôi khi có thể dẫn đến sự khác biệt nhỏ giữa tỷ lệ phần trăm của ứng dụng và tổng tỷ lệ phần trăm của cửa sổ.
Ví dụ: Nếu một ứng dụng có hai cửa sổ được sử dụng, mỗi cửa sổ được sử dụng 0,7%
trong tổng thời gian, cả hai cửa sổ sẽ báo cáo 1%
từng ( 0.7
-> làm tròn thành 1
), trong khi báo cáo sử dụng của ứng dụng 1%
( 1.4
-> làm tròn đến 1
)
Không cần phải nói rằng những khác biệt này là hoàn toàn không liên quan trong toàn bộ bức tranh.
Kịch bản
#!/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
Làm thế nào để thiết lập
Kịch bản cần xdotool
lấy thông tin của cửa sổ
sudo apt-get install xdotool
Sao chép tập lệnh vào một tập tin trống, lưu nó dưới dạng window_logs.py
Kiểm tra- chạy tập lệnh: khởi động tập lệnh bằng lệnh (từ thiết bị đầu cuối):
python3 /path/to/window_logs.py
Sau một phút, tập lệnh tạo một tệp nhật ký với kết quả đầu tiên ~/.usagelogs
. Các tập tin được đóng dấu thời gian với ngày & thời gian tạo. Các tập tin được cập nhật một lần mỗi phút.
Ở dưới cùng của tệp, bạn có thể thấy cả thời gian bắt đầu và dấu thời gian của lần chỉnh sửa mới nhất. Bằng cách này, bạn luôn có thể thấy khoảng thời gian của tệp là gì.
Nếu tập lệnh khởi động lại, một tệp mới có dấu thời gian (bắt đầu) mới sẽ được tạo.
Nếu tất cả đều hoạt động tốt, hãy thêm vào Ứng dụng khởi động: Dash> Ứng dụng khởi động> Thêm. Thêm lệnh:
/bin/bash -c "sleep 15 && python3 /path/to/window_logs.py"
Thêm ghi chú
~/.uselogs
là một thư mục ẩn theo mặc định. Nhấn (trong nautilus
) Ctrl+ Hđể hiển thị.
Như vậy, kịch bản làm tròn tính linh hoạt của cửa sổ trong 5 giây, giả sử ít hơn 5 giây không thực sự sử dụng cửa sổ. Nếu bạn muốn thay đổi giá trị, hãy đặt nó vào phần đầu của tập lệnh trong dòng:
# -- set update/round time (seconds)
period = 5
# --
Kịch bản cực kỳ "ít nước ép". Hơn nữa, vì các cập nhật thời gian trên mỗi cửa sổ được thực hiện bên trong tập lệnh, nên số lượng dòng trong tệp nhật ký được giới hạn ở số lượng cửa sổ thực tế được sử dụng.
Tuy nhiên, tôi sẽ không chạy tập lệnh trong nhiều tuần liên tiếp, ví dụ, để ngăn việc tích lũy quá nhiều dòng (= bản ghi cửa sổ) để duy trì.