대체 GUI에서 모든 GUI 기반 작업을 로그 파일에 볼 수 있습니까?


9

예를 들어, 일반적으로 응용 프로그램 메뉴에서 마우스 패드 (xedit에 해당하는 xfce)를 엽니 다. 그러나 터미널을 입력하여이 작업을 수행 할 수도 있음을 알고 있습니다 mousepad.

이 예제에서 GUI를 통해 마우스 패드를 열 때마다 다음과 같은 내용을 나타내는 새 줄이 로그 파일에 작성됩니다 Sep 5 15:35:11 lucho@lucho:~$ mousepad. 더 일반적으로, 내가 원하는 것은 명령 줄을 통해 잠재적으로 수행 할 수있는 모든 GUI 활동 (프로그램 열기, 권한 변경, 시스템 설정 수정 등)을 대체 명령 줄 실행 형식으로 기록하는 것 입니다. man페이지를 거치지 않고 명령 줄을 사용하는 방법에 대한 지식을 향상시키기 위해 이것을 원합니다 . 명령 줄 (스크립트 또는 키보드 단축키를 통해 자동화 할 수 있음)을 통해 수행하지 않는 GUI를 통해 수행하는 많은 작업이 있으며이 로그 파일을 사용하는 것이이를 배우는 좋은 방법입니다.

syslog 파일이 있다는 것을 알고 /var/log있지만 이것이 필요한 것은 아닙니다. 우분투 저장소의 Activity Log Manager 앱에는 내가 아는 한 명령 줄 형식이 표시되지 않습니다. 내 홈 폴더에 있지만 GUI 기반 활동을 기록하는 .bash_history 파일과 같은 것이 필요합니다.


strace와 같은 도구를 사용하여 실행중인 프로그램을 들여다보고 어떤 시스템 호출을하는지 확인할 수 있습니다. 이렇게하면 방대한 양의 데이터가 생성됩니다.
Amias

GUI에서 열리는 프로그램의 이진 이름을 단순히 기록하는 프로그램을 찾고 있다면 스크립트에서 할 수 있습니다. 그것이 당신이 원하는 것이라면 알려주세요. 요구 사항이 실제로 무엇인지 명확히하면 더 좋을 것이므로 질문을 편집하십시오. 이들은 실제 쉘 명령에 연결되어 있지 않기 때문에 이러한 버튼을 클릭하거나 브라우저에서 새 탭 열기와 같은 GUI 기반의 활동을 기록하는 것은 쉽게 기록 할 수있는 것이 아닙니다
세르지 Kolodyazhnyy

@Serg 당신이 제안하는 로그는 확실히 내가 찾고있는 것일 것입니다. 기존 답변에서 알 수 있듯이 GLI 이름 대신 CLI 이름을 기반으로하는 "작업 관리자"로그와 같은 것이 일치하지 않을 수 있습니다. 예를 들어, Settings에서 "Language Support"를 열면 해당 CLI를 알고 싶습니다. 기타 ...

@luchonacho OK, 오늘 글을 쓰기 시작할 준비가되면 게시 할 것입니다. 그건 그렇고, 설정의 "언어 지원"에는 자체 언어가 없습니다. 블루투스 메뉴 또는 배경 메뉴와 같은 일부 작업은 데스크탑이나 Unity, XFCE 또는 그놈에 따라 unity-control-center background또는 지정할 수 있습니다 gnome-control-center background. 그러나 외부 세계는 아마 볼 것입니다gnome-control-center
Sergiy Kolodyazhnyy

GUI 응용 프로그램이 수행하는 작업을 확인하고 해당 기능이 무엇인지 확인하는 방법에는 여러 가지가 있습니다. 무차별적인 힘으로 발생하는 모든 것을 맹목적으로 기록하려고 시도하는 것이 비효율적입니다. 특정 도구를 사용하여 특정 경우에 더 잘 알 수 있습니다.
Jacob Vlijm

답변:


2

소개

모든 GUI 동작 을 기록 할 수는 없지만 열린 창에 해당하는 기록 명령과 같은 작업을 수행 할 수 있습니다. 아래는 작업을 수행하는 간단한 파이썬 스크립트입니다. 아직 개발 중이지만 필요한 작업의 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디렉토리에 저장하십시오 . ~/bindirectory 가 없으면 하나 만드십시오. 거기에 스크립트 파일을 저장하고로 실행 가능한지 확인하십시오 chmod +x ~/bin/log_open_windows.py. 원하는 경우 언제든지 명령 줄을 호출 ~/log_open_windows.py하여 명령 줄에서 실행할 수 있습니다 .


감사. 유망 해 보인다! 두 가지 질문이 있습니다. 그것을 실행하는 방법? 10 % 빠진 것은 무엇입니까?

맵시 있는! 나에게서 +1!
Fabby

@luchonacho 사용법에 대한 단락을 추가했습니다. 앞에서 설명한대로 명령 줄에서 수동으로 사용하는 것이 좋습니다. 시작할 때 자동으로 시작되도록 할 수는 있지만 권장하지는 않습니다. 누락 된 10 %는 추가하려는 다른 몇 가지 기능이지만 추가 할 것이라고는 생각하지 않습니다. 지금은 잘 작동합니다. 그러나 어쩌면 나는 다시 마음을 바꿀 것이다
Sergiy Kolodyazhnyy

이것은 아마도 완벽한 솔루션이 존재하지 않는다는 것을 알았을 때 내가 찾던 것에 가장 가깝습니다. 감사!

4

그러한 종류의 로그 파일을 학습의 기초로 제안하는 것은 실제로 훌륭한 아이디어입니다!

불행히도, GUI 프로그램의 많은 동작은 외부 명령을 사용하지 않고 프로그램 자체에서 구현됩니다. 외부 명령을 사용하더라도 쉘에서 수행하는 것과 다른 방식 일 수 있습니다.
따라서 존재하지 않으며 구현하기가 쉽지 않습니다.

그러나 문제의 일부에 대한 해결책이 있습니다 .GUI의 프로그램 이름이 GUI 명령이 로컬 언어로 번역 된 경우뿐만 아니라 쉘 명령에 대해 알아야하는 프로그램 이름과 때로는 다를 수 있습니다.

예를 들어, Filescomman 라인에서 프로그램을 시작하는 방법은 무엇입니까?

*.desktop이름에 대한 모든 파일 을 조사해야합니다 . 여기에서 다음 명령을 찾습니다 Exec:

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

GUI 프로그램의 데스크탑 파일 이름 및 명령을 나열합니다. File원하는 정확한 이름으로 바꾸십시오. 여러 단어 일지라도 (문자열 검색의 경우 =및을 $제외).

명령과 함께, I의 발견은 Files할 수있다 nautilus, dolphin또는 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

음, 내 질문은 확장 된 복잡성에 대한 리눅스의 견해에 기초를두고 있습니다. 더 복잡한 코드를 기반으로보다 정교한 프로그램이 빌드되는 GUI 응용 프로그램은 터미널 명령에 의존하지만 터미널은 bash 코드를 기반으로하지만 터미널은 bash 코드를 기반으로하기 때문에 그렇지 않을 수도 있습니다 파이썬이나 C ++ 등으로 작성 될 수 있습니다. 내가 틀렸습니까?

복잡성 계층이 존재하지만 시스템 호출, 라이브러리 함수 및 그래픽 사용자 인터페이스 또는 명령 행 인터페이스가 있습니다.
Volker Siegel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.