บทนำ
แม้ว่าจะไม่สามารถบันทึกการกระทำของ GUI ทั้งหมดได้แต่สิ่งต่าง ๆ เช่นคำสั่งการบันทึกที่สอดคล้องกับหน้าต่างที่เปิดสามารถทำได้ ด้านล่างเป็นสคริปต์ python แบบง่ายที่ทำงาน มันยังอยู่ในการพัฒนา แต่ทำ 90% ของงานที่ต้องการ
รหัสแหล่งที่มา
#!/usr/bin/env python3
import gi
gi.require_version('Gtk', '3.0')
gi.require_version('Gdk', '3.0')
from gi.repository import Gdk,Gtk
import time
import os
import subprocess
def run_cmd(cmdlist):
""" Reusable function for running external commands """
new_env = dict(os.environ)
new_env['LC_ALL'] = 'C'
try:
stdout = subprocess.check_output(cmdlist, env=new_env)
except subprocess.CalledProcessError:
pass
else:
if stdout:
return stdout
def print_info(stack,event):
base_xprop = ['xprop','-notype']
for xid in stack:
pid = None
check_pid = run_cmd(base_xprop + [ '_NET_WM_PID', '-id',str(xid)])
if check_pid:
pid = check_pid.decode().split('=')[1].strip()
with open('/proc/'+pid+'/cmdline') as fd:
command = fd.read()
print(time.strftime("%D %H:%M:%S" + " "*3) + event + pid + " " + command)
def main():
sc = Gdk.Screen.get_default()
old_stack = None
while True:
stack = [ win.get_xid() for win in sc.get_window_stack() ]
if old_stack:
# Difference between current and old stack will show new programs
diff = set(stack) - set(old_stack)
if diff:
print_info(diff," 'New window open' ")
else:
print_info(stack," 'Script Started' ")
old_stack = stack
time.sleep(2)
if __name__ == '__main__': main()
ทดสอบการทำงาน:
$ ./log_open_windows.py
01/25/17 15:33:13 'Script Started' 2915 nautilus-n
01/25/17 15:33:13 'Script Started' 3408 /opt/google/chrome/chrome
01/25/17 15:33:13 'Script Started' 12540 /usr/bin/python/usr/bin/x-terminal-emulator
01/25/17 15:33:13 'Script Started' 2454 compiz
01/25/17 15:33:13 'Script Started' 2454 compiz
01/25/17 15:33:13 'Script Started' 2454 compiz
01/25/17 15:33:13 'Script Started' 2454 compiz
01/25/17 15:33:13 'Script Started' 2454 compiz
01/25/17 15:33:21 'New window open' 15143 /usr/lib/firefox/firefox-new-window
01/25/17 15:33:27 'New window open' 15196 unity-control-center
สคริปต์แสดงการประทับเวลาประเภทเหตุการณ์หน้าต่าง PID และคำสั่งที่เกี่ยวข้อง
วิธีใช้
ใช้กฎมาตรฐานของสคริปต์ใด ๆ ตรวจสอบให้แน่ใจว่าคุณเก็บสคริปต์ไว้ใน~/bin
ไดเรกทอรี หากคุณไม่มี~/bin
ไดเรกทอรีให้สร้างขึ้นใหม่ บันทึกไฟล์สคริปต์ที่นั่นและตรวจสอบให้แน่ใจว่าสามารถเรียกใช้งานchmod +x ~/bin/log_open_windows.py
ได้ หลังจากกว่าที่คุณสามารถเรียกใช้จากบรรทัดคำสั่งได้ตลอดเวลาที่คุณต้องการโดยโทร~/log_open_windows.py
ในบรรทัดคำสั่ง