GUI 기반 응용 프로그램이 백그라운드에서 셸 명령을 실행합니까?


29

이틀 전에 Windows에서 Ubuntu 16.04로 마이그레이션했습니다. Unity 데스크톱을 커스터마이징 할 수있는 방법이 마음에 듭니다. 데스크탑 환경의 모양과 느낌으로 놀고 있습니다. Windows에서와 마찬가지로 시작 프로그램이 화면 하단에 위치하기를 원했습니다. 인터넷 검색에서 다음과 같은 명령을 발견했습니다.

gsettings set com.canonical.Unity.Launcher launcher-position Bottom

또한 작업을 완료하기위한 unity-tweak-tool 및 dconf 편집기가 있습니다. 그러나 이것들은 일을 끝내는 GUI 접근법입니다.

내 질문은 :

  • 이러한 GUI 기반 응용 프로그램도 백그라운드에서 동일한 명령을 실행합니까?
  • 이러한 응용 프로그램의 내부 작업을 들여다 보는 방법은 무엇입니까? 버튼을 클릭 할 때마다 실행되는 명령을 실제로 보는 방법이 있습니까?
  • 이러한 응용 프로그램이 백그라운드에서 터미널을 열고이 명령을 실행합니까?

여기에 대한 답변 은 프로세스의 표준 파일 디스크립터를 얻는 방법을 알려줍니다. 그러나 출력에 아무것도 얻지 못했습니다.

또한이 strace -p pid -o output.txt명령은 파일에 많은 양의 텍스트를 던집니다.

간단히 말해, GUI 응용 프로그램을 사용하여 작업을 명령 줄에서 수행하는 것과 동일하게 수행합니까?

답변:


35

이러한 GUI 기반 응용 프로그램도 백그라운드에서 동일한 명령을 실행합니까?

예, 아니오 그들은 쓰기 dconf설정 데이터베이스,하지만 그들은 그렇게 할 다른 방법을 사용할 수 있습니다. 파이썬으로 작성된 프로그램은 gi.repository.Gio모듈을 사용하거나 (많이 사용하기 때문에 알고 있음) 대신 gsettings호출하여 외부 명령으로 사용할 수 있으며 subprocess.Popen(['gsettings','org.some.schema','some-key','value'])기본적으로 쉘 명령으로 실행됩니다. AC 프로그램은 비슷한 것을 사용 gio.h하거나 라이브러리를 사용하거나exec()Popen 파이썬에서 와 동일한 기능을 수행 . 제목 질문에 대답하려면 "GUI 기반 응용 프로그램이 백그라운드에서 쉘 명령을 실행합니까?" 그들은 할 수 있지만 앱이 작성된 언어에 대한 라이브러리가 있기 때문에 필요하지 않을 수 있으며 새로운 프로세스를 생성하는 것보다 라이브러리 함수를 사용하는 것이 조금 더 빠를 것입니다.

라이브러리 / 모듈을 사용하여 수행 된 방법에 대한 샘플을 제공하려면 시작 프로그램 목록 표시기 의 소스 코드를 자유롭게 살펴보십시오 . 거기에서 Gio.Settings클래스 의 인스턴스를 만들고 함수를 사용하여 원하는 목록 유형에 따라 Unity 런처를 수정했습니다.

이러한 응용 프로그램의 내부 작업을 들여다 보는 방법은 무엇입니까? 버튼을 클릭 할 때마다 실행되는 명령을 실제로 보는 방법이 있습니까?

아니요. 버튼을 누르거나 창 요소를 클릭 할 때 해당 앱의 프로그래밍 언어로 어떤 명령이 실행되는지 확인하려면 불가능합니다. 가능한 경우 응용 프로그램의 소스 코드를 읽으십시오. 당신이 사용할 수있는dconf watch /어떤 설정이 변경되고 있는지 확인하는 데 있지만 설정이 완료된 방법은 볼 없습니다.

기술적으로 디버거 작동 방법, 메모리 주소 읽기 및 어셈블리 언어를 알고 있으면 CPU 및 메모리 수준에서 앱의 기능을 알 수 있습니다. 이것을 소프트웨어 리버스 엔지니어링이라고하며 보안 전문가가 악성 소프트웨어를 분석하고 합법적 인 소프트웨어의 취약점을 발견하기 위해 자주 사용합니다.

이러한 응용 프로그램이 백그라운드에서 터미널을 열고이 명령을 실행합니까?

아니요, 터미널이 연결되어 있지 않습니다. 많은 프로그램 dconf이 사용자 의 데이터베이스가있는 위치를 알고 작성합니다. 프로세스 간 통신 버스도 있습니다.dbus프로그램이 신호를 보낼 수있는 프로그램은 "이봐, 나에게 메시지 야!"

추가

  • 응용 프로그램이 다른 응용 프로그램을 실행할 수 있습니까? 예, 표준 fork()execve()시스템 호출을 통해 이루어집니다 . Linux 및 기타 * nix 시스템에서 프로세스를 작성하는 본질은 주로이 두 가지를 기반으로합니다. 내장되지 않은 명령을 실행하기위한 쉘 메커니즘은 특히 많이 사용합니다. 대화식으로 실행할 때

    $ ls 
    

    쉘은을 통해 새로운 프로세스를 생성 할 것이고 fork(), 그 프로세스는 실행될 execve() 것이다 ls. execve()그 새로운 갈래 과정이 어떻게 될지 ls. pipe()시스템 호출의 출력을 다시 읽어 도움이 될 것입니다 ls. 파이프 메커니즘의 작동 방식을 이해하기 위해 파이프와 리디렉션의 차이점은 무엇입니까?에 대한 내 답변을 읽는 것이 좋습니다. 이는 |운영자 일뿐 만 아니라 실제로 시스템 콜입니다.

  • 응용 프로그램이 쉘 명령을 실행할 수 있습니까? 셸 구문은 셸 자체에서만 이해됩니다. 그러나 명령 줄 -c스위치 로 셸을 시작하고 적절한 명령을 제공하면됩니다. 사용자 정의 바로 가기는 실행 파일에서 작동하며 구문을 이해할 수있는 쉘이 없기 때문에 그놈 또는 기타 데스크탑 환경에서 설정된 사용자 정의 바로 가기에 자주 사용됩니다. 예를 들어, 명령 bash -c 'xdotool key Ctrl+Alt+T'을 간접적으로 실행 xdotool하거나 bash -c 'cd $HOME/Desktop; touch New_File'바로 가기를 통해 데스크탑에 새 파일을 작성 해야 합니다 . 쉘 변수를 명시 적으로 사용하기 때문에 쉘 변수를 사용할 수 있으므로 특히 흥미로운 예입니다.


2
자세한 설명과 각 질문에 대해 개별적이고 체계적으로 답변 해 주신 @Serg에게 감사드립니다!
ptmdevncoder

@Logan 내 기쁨, 항상 도와 드리겠습니다 :)
Sergiy Kolodyazhnyy

1
운 좋게도 언급 된 툴의 소스는 FLOSS이므로 사용할 수 있습니다. 따라서이 경우에는 역전하는 것이 약간 과잉이라고 말합니다. :)
Andrea Lazzarotto

1
@AndreaLazzarotto Yep, Unity Tweak Tool 및 Dconf 편집기-오픈 소스이므로 리버스 엔지니어링 할 필요가 없습니다. 내 대답에 나는 모든 것을 매우 일반적으로 유지하고 그 도구뿐만 아니라 다른 가능성을 다루려고 노력했다
Sergiy Kolodyazhnyy

GUI 응용 프로그램의 요점은 더 빠릅니다. 쉘 도구와 함께 사용할 값을 피하거나 마샬링하는 것은 번거롭고 쉽게 얻을 수 있으며 간단하게 라이브러리를 사용할 수 있다면 무의미합니다. 다시 디버깅 : 응용 프로그램이 디버그 기호로 설치되고 gdb에서 지원하는 언어로 작성된 경우 (예 : 데비안에서 해당 -dbg 패키지 설치) 어셈블러를 알 필요가 없습니다. gdb는 다음을 사용하여 소스 코드를 표시합니다. 응용 프로그램을 단계별로 실행하는 동안 정보를 디버그하십시오. 지루한 GUI 상용구 때문에 디버깅을 시작할 적절한 진입 점을 찾는 것이 더 어렵습니다.
조나스 셰퍼

21

무슨 일이 일어나고 있는지 감시

이러한 설정 편집기의 대부분은 다음을 실행하여 볼 수 있습니다.

dconf watch /

터미널에서.

괴롭힘

또한 대부분의 경우 위의 명령으로 발생하는 것을 달성하려면 이러한 응용 프로그램에서 dconf데이터베이스 를 편집해야 합니다 (아래 참조). dconf 의 cli 옵션 (권장하지 않음)을 사용하거나 언급 한 것과 같은 해당 명령 을 실행 하여 직접 수행 할 수 있습니다 .gsettings

이 명령을 실행하려면 예제에서 볼 수 있듯이 터미널 창이 필요하지 않습니다.

정보, gsettings, dconf 및 dconf 데이터베이스

gsettings의 cli 프론트 엔드 dconf이며, 차례로 dconf대부분의 설정이 저장된 데이터베이스를 이진 형식으로 편집합니다. 이 좋은 답변을 참조하십시오 .

그런데 dconf데이터베이스 dconf는 리포지토리에있는 편집기 를 통해 GUI에서 편집 할 수도 있습니다 .

여기에 이미지 설명을 입력하십시오

작업 샘플

에이. 파이썬에서

여기에 이미지 설명을 입력하십시오

작동중인 샘플 아래에서 단일 (토글) 버튼으로 GUI에서 실행기 위치를 토글하는 후드 아래에서 발생하는 상황을 보여줍니다.

#!/usr/bin/env python3
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
import subprocess

key = ["com.canonical.Unity.Launcher", "launcher-position"]

class ToggleWin(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="Toggle")
        button = Gtk.Button("Toggle launcherposition")
        button.connect("clicked", self.toggle)
        self.add(button)

    def toggle(self, *args):
        # read the current setting on launcher position
        current = subprocess.check_output([
            "gsettings", "get", key[0], key[1]
            ]).decode("utf-8").strip()
        # toggle to the other option
        new = "'Left'" if current == "'Bottom'" else "'Bottom'"
        subprocess.Popen([
            "gsettings", "set", key[0], key[1], new
            ])

def delete_actions(*args):
    Gtk.main_quit()

def miniwindow():
    window = ToggleWin()
    window.connect("destroy", delete_actions)
    window.show_all()
    Gtk.main()

miniwindow()
  • 빈 코드에 코드 붙여 넣기 file.py
  • 다음 명령으로 실행하십시오.

    python3 /path/to/file.py
    

... 그리고 재미있게 보내십시오.

비. 실행기 아이콘

간단한 실행기조차도 GUI에서 작업을 수행 할 수 있습니다.

여기에 이미지 설명을 입력하십시오

[Desktop Entry]
Name=Set launcherposition
Exec=zenity --info --text="Right- click to set launcher position"
Type=Application
StartupNotify=False
Icon=preferences-system

Actions=Launcher to bottom;Launcher on the left;

[Desktop Action Launcher to bottom]
Name=Launcher to bottom
# right click option to set launcher to bottom
Exec=gsettings set com.canonical.Unity.Launcher launcher-position Bottom

[Desktop Action Launcher on the left]
Name=Launcher on the left
# right click option to set launcher to left
Exec=gsettings set com.canonical.Unity.Launcher launcher-position Left
  • 빈 파일에 코드를 붙여넣고 다른 이름으로 저장하십시오. setlauncher.desktop
  • 실행기로 드래그하고 마우스 오른쪽 버튼을 클릭하십시오.

영구적으로 사용하려면 ~/.local/share/applications(로컬 사용을 위해) 또는 ~/usr/share/applications모든 사용자를 위해 보관하십시오 .


@Logan은 그것을 언급하지 않습니다 :)
Jacob Vlijm
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.