Dapatkah saya melihat dalam file log semua tugas berbasis GUI dalam format command-line alternatifnya?

9

Sebagai contoh, saya biasanya membuka mousepad (setara xfce dari gedit) dari menu aplikasi. Namun, saya tahu Anda juga bisa melakukan ini di terminal dengan mengetik mousepad.

Mengikuti contoh ini, yang saya inginkan adalah setiap kali saya membuka mousepad melalui GUI, baris baru ditulis dalam file log yang menyatakan sesuatu seperti Sep 5 15:35:11 lucho@lucho:~$ mousepad. Lebih umum, yang saya inginkan adalah mencatat semua aktivitas GUI yang berpotensi dilakukan melalui command-line (seperti membuka program, mengubah izin, memodifikasi pengaturan sistem, dll) tetapi ditulis dalam format eksekusi command-line alternatifnya . Saya ingin ini untuk meningkatkan pengetahuan saya tentang cara menggunakan command-line (tanpa melalui manhalaman). Ada banyak hal yang saya lakukan melalui GUI yang tidak saya lakukan melalui command-line (beberapa berpotensi automatable melalui skrip atau melalui pintasan keyboard) dan memiliki file log ini akan menjadi cara yang baik untuk mempelajarinya.

Saya sadar akan keberadaan file syslog di /var/logtetapi bukan itu yang saya butuhkan. Aplikasi Activity Log Manager dari repositori Ubuntu tidak menunjukkan format baris perintah, sejauh yang saya tahu. Saya memerlukan sesuatu seperti file .bash_history yang ada di folder rumah saya tetapi merekam aktivitas berbasis GUI saya.


sumber
Anda dapat menggunakan alat seperti strace untuk mengintip ke dalam program yang sedang berjalan dan melihat apa yang dibuat oleh sistem, ini akan menghasilkan data dalam jumlah besar
Amias
Jika Anda mencari program yang hanya mencatat nama biner program yang terbuka di GUI, saya bisa melakukannya dalam sebuah skrip. Jika itu yang Anda inginkan, beri tahu saya. Akan lebih baik jika Anda menjelaskan apa persyaratan Anda sebenarnya, jadi harap edit pertanyaan Anda. Merekam aktivitas berbasis GUI, seperti mengklik tombol atau membuka tab baru di browser bukanlah sesuatu yang dapat dengan mudah direkam, karena ini tidak terhubung ke perintah shell yang sebenarnya
Sergiy Kolodyazhnyy
@ Log Log yang Anda sarankan tentu saja apa yang saya cari. Sesuatu seperti log "Task Manager" yang didasarkan pada nama CLI dan bukan nama GLI, yang, seperti yang disarankan oleh jawaban yang ada, mungkin tidak sesuai. Misalnya, jika saya membuka "Dukungan Bahasa" di Pengaturan, saya ingin tahu padanan CLI-nya. Dll ...
@luchonacho OK, saya akan mulai menulis hari ini, akan memposting ketika sudah siap. Omong-omong, "Dukungan Bahasa" di Pengaturan tidak memiliki cli yang setara dengan miliknya. Beberapa hal, seperti menu bluetooth atau menu latar belakang, lakukan - Anda dapat menentukan unity-control-center backgroundatau gnome-control-center background(tergantung pada desktop Anda, Unity atau XFCE atau GNOME). Tetapi dunia luar mungkin hanya akan melihatgnome-control-center
Sergiy Kolodyazhnyy
Ada banyak, banyak cara untuk mengetahui tugas apa yang dilakukan oleh aplikasi GUI, dan mencari tahu apa yang setara dengan klien mereka. Tampaknya tidak efisien bagi saya untuk mencoba membabi buta merekam semua yang terjadi dengan kekerasan, memastikan bahwa Anda tidak akan menangkap semua. Lebih baik mencari tahu dalam kasus tertentu, menggunakan alat khusus.
Jacob Vlijm

Jawaban:

2

pengantar

Meskipun tidak mungkin untuk mencatat semua tindakan GUI, hal-hal seperti perintah logging yang berhubungan dengan windows yang terbuka dapat dilakukan. Di bawah ini adalah skrip python sederhana yang melakukan pekerjaan. Masih dalam pengembangan, tetapi melakukan 90% dari tugas yang diperlukan.

Kode sumber

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

Uji coba:

$ ./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

Script menunjukkan cap waktu, jenis acara, PID jendela, dan perintah yang sesuai.

Cara Penggunaan

Aturan standar dari setiap skrip berlaku. Pastikan Anda menyimpan skrip di ~/bindirektori. Jika Anda tidak memiliki ~/bindirektori, maka buatlah. Simpan file skrip di sana dan pastikan itu dapat dieksekusi dengan chmod +x ~/bin/log_open_windows.py. Setelah daripada Anda dapat menjalankannya dari baris perintah kapan saja Anda inginkan dengan memanggil ~/log_open_windows.pybaris perintah.

Sergiy Kolodyazhnyy
sumber
Terima kasih. Terlihat menjanjikan! Dua pertanyaan. Bagaimana cara menjalankannya? Apa yang 10% hilang?
Bagus! +1 dari saya!
Fabby
@luchonacho Saya menambahkan paragraf tentang penggunaan. Saya akan merekomendasikan Anda menggunakannya secara manual dari command-line seperti yang saya jelaskan. Anda dapat membuatnya mulai secara otomatis saat start-up, tetapi saya tidak menyarankan melakukan itu. 10% yang hilang adalah beberapa fitur lain yang ingin saya tambahkan, tetapi saya rasa saya tidak akan menambahkannya. Ini berfungsi cukup baik untuk saat ini. Tapi mungkin saya akan berubah pikiran lagi
Sergiy Kolodyazhnyy
Ini mungkin yang terdekat dengan apa yang saya cari, sadar bahwa solusi sempurna tidak ada. Terima kasih!
4

Mengusulkan file log semacam itu sebagai dasar untuk belajar sebenarnya adalah ide yang brilian!

Sayangnya, banyak tindakan program GUI diimplementasikan dalam program itu sendiri, tidak menggunakan perintah eksternal; Dan bahkan jika itu menggunakan perintah eksternal, itu mungkin dengan cara yang berbeda dari yang akan dilakukan di shell;
Sehingga tidak ada, dan tidak mudah diimplementasikan.

Tapi saya punya solusi untuk sebagian masalah: Nama program di GUI terkadang berbeda dari nama program yang perlu diketahui untuk perintah shell - tidak hanya jika nama GUI diterjemahkan ke bahasa lokal.

Misalnya, bagaimana memulai program Filesdi baris comman?

Kita perlu melihat semua *.desktopfile untuk namanya. Di sana, kami menemukan perintah di Execbaris:

locate -b '.desktop' | xargs grep -ls '^Name.*=Files$' | xargs grep '^Exec.*'

mencantumkan nama dan perintah file desktop untuk program GUI File- ganti dengan nama persis yang Anda cari - meskipun itu adalah beberapa kata (untuk pencarian substring, tinggalkan =dan $).

Dengan perintah, saya temukan Filesmungkin nautilus, dolphinatau active-filebrowser:

/etc/xdg/autostart/nautilus-autostart.desktop:Exec=nautilus -n
/usr/share/app-install/desktop/nemo:nemo.desktop:Exec=nemo %U
/usr/share/app-install/desktop/plasma-active:kde4__active-filebrowser.desktop:Exec=active-filebrowser -graphicssystem raster %u
/usr/share/applications/nautilus-folder-handler.desktop:Exec=nautilus %U
/usr/share/applications/nautilus.desktop:Exec=nautilus --new-window %U
/usr/share/applications/nautilus.desktop:Exec=nautilus --new-window
Volker Siegel
sumber
Mmm, pertanyaan saya mendasari pandangan linux dari kompleksitas berskala, di mana program yang lebih rumit dibangun berdasarkan kode yang lebih sederhana, jadi saya pikir aplikasi GUI bergantung pada perintah terminal tetapi mungkin tidak terjadi karena terminal didasarkan pada kode bash sedangkan perangkat lunak dapat ditulis dengan python atau c ++ atau dll. Apakah saya salah?
Lapisan kerumitan memang ada, tetapi dengan cara yang berbeda: secara rougnly, ada panggilan sistem, fungsi perpustakaan, dan di atas baik antarmuka pengguna grafis, atau antarmuka baris perintah - mereka adalah alternatif.
Volker Siegel