Czy aplikacja oparta na GUI wykonuje polecenia powłoki w tle?


29

Przeprowadziłem migrację do systemu Ubuntu 16.04 zaledwie 2 dni temu z systemu Windows. Podoba mi się sposób, w jaki możemy dostosować Unity Desktop. Po prostu bawię się wyglądem i stylem środowiska Desktop. Podobnie jak w systemie Windows, chciałem, aby program uruchamiający znajdował się na dole ekranu. Na Googlingu znalazłem polecenie, które brzmi:

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

Ponadto dostępne są narzędzia unity-tweak-tool i edytor dconf do wykonania zadania. Ale to podejście oparte na graficznym interfejsie użytkownika do wykonywania zadań.

Moje pytania to:

  • Czy te aplikacje oparte na GUI wykonują to samo polecenie w tle?
  • Jak zerknąć na wewnętrzne działanie tych aplikacji? Mam na myśli, czy jest jakiś sposób na spojrzenie na polecenia, które są wykonywane przy każdym kliknięciu przycisku?
  • Czy te aplikacje otwierają terminal w tle i wykonują te polecenia?

Odpowiedź tutaj mówi, jak uzyskać standardowy deskryptor pliku procesu. Ale nie otrzymałem niczego w wyniku.

Ponadto strace -p pid -o output.txtpolecenie wrzuca ogromną ilość tekstu do pliku.

Krótko mówiąc, czy robienie rzeczy przy użyciu aplikacji GUI jest takie samo jak robienie rzeczy z wiersza poleceń?

Odpowiedzi:


35

Czy te aplikacje oparte na GUI wykonują to samo polecenie w tle?

Tak i nie. Piszą do dconfbazy danych ustawień, ale mogą to robić na różne sposoby. Programy napisane w Pythonie prawdopodobnie będą używać gi.repository.Giomodułu (wiem, ponieważ dużo go używam) lub mogą zamiast tego używać gsettingsjako polecenia zewnętrznego, wywołując subprocess.Popen(['gsettings','org.some.schema','some-key','value']), i to w zasadzie będzie działać jako polecenie powłoki. Program AC użyje czegoś podobnego, prawdopodobnie gio.hbiblioteki, lub może nawet użyć exec()rodziny funkcji, aby zrobić to samo, co Popenw Pythonie. Aby odpowiedzieć na twoje tytułowe pytanie: „Czy aplikacja oparta na GUI wykonuje polecenia powłoki w tle?” Mogą, ale prawdopodobnie nie jest to konieczne, ponieważ istnieje biblioteka dla dowolnego języka, w którym napisana jest aplikacja, i prawdopodobnie użycie funkcji bibliotecznej będzie nieco szybsze niż tworzenie nowego procesu.

Aby dać ci przykład, jak to jest zrobione z bibliotekami / modułami, zachęcamy do zapoznania się z kodem źródłowym wskaźnika mojej listy uruchamiania. Tam napisałem funkcję, aby utworzyć instancję Gio.Settingsklasy, a następnie użyć jej do zmodyfikowania programu uruchamiającego Unity w zależności od typu listy, którą chcesz tam mieć.

Jak zerknąć na wewnętrzne działanie tych aplikacji? Mam na myśli, czy jest jakiś sposób na spojrzenie na polecenia, które są wykonywane przy każdym kliknięciu przycisku?

Nie. Jeśli chcesz zobaczyć, które polecenie jest wydawane w języku programowania tej aplikacji, po naciśnięciu przycisku lub kliknięciu elementów okna, nie jest to możliwe. Przeczytaj kod źródłowy aplikacji, jeśli jest to możliwe. Możesz użyć, dconf watch /aby zobaczyć, które ustawienia są zmieniane, ale nie jak to zrobić.

Technicznie, jeśli wiesz, jak obsługiwać debugger, odczytywać adresy pamięci i znasz język asemblera, możesz wiedzieć, co robi aplikacja na poziomie procesora i pamięci. Jest to znane jako inżynieria wsteczna oprogramowania i jest często wykorzystywane przez specjalistów ds. Bezpieczeństwa do analizy złośliwego oprogramowania i wykrywania luk w legalnym oprogramowaniu.

Czy te aplikacje otwierają terminal w tle i wykonują te polecenia?

Nie, nie ma podłączonego terminala. Wiele programów wie, gdzie znajduje się dconfbaza danych użytkownika i tam pisze. Istnieje również międzyprocesowa magistrala komunikacyjna znana jako dbus, w której programy mogą wysyłać sygnały, a program będzie przypominał „Hej, to dla mnie wiadomość!”

Uzupełnienie

  • Czy aplikacje mogą uruchamiać inne aplikacje? Tak, odbywa się to za pomocą wywołań standardowych fork()i execve()systemowych. Istota tworzenia procesów w systemie Linux i innych systemach * nix jest w dużej mierze oparta na tych dwóch. Mechanizm powłoki do uruchamiania niewbudowanych poleceń bardzo często tego używa. Gdy biegniesz interaktywnie

    $ ls 
    

    powłoka utworzy nowy proces za pośrednictwem fork(), proces ten zostanie uruchomiony, execve() który się rozpocznie ls. Z powodu tego, jaki będzie execve()ten nowy rozwidlony proces ls. pipe()Wywołanie systemowe, co pozwoli odczytać z powrotem wyjście ls. Zdecydowanie sugeruję przeczytanie mojej odpowiedzi na pytanie Jaka jest różnica między potokiem a przekierowaniem, aby zrozumieć, jak działa mechanizm potoku - to nie tylko |operator, ale tak naprawdę połączenie systemowe.

  • Czy aplikacje mogą uruchamiać polecenia powłoki? Nie. Składnia powłoki jest rozumiana tylko przez samą powłokę. Możesz jednak uruchomić powłokę za pomocą -cprzełącznika wiersza poleceń i podać odpowiednie polecenia. Jest to często używane w przypadku niestandardowych skrótów ustawianych w środowisku GNOME lub innych środowiskach komputerowych, ponieważ niestandardowe skróty działają na plikach wykonywalnych i nie ma powłoki umożliwiającej zrozumienie składni. W ten sposób na przykład zrobiłbyś bash -c 'xdotool key Ctrl+Alt+T'pośrednio uruchomić xdotoolpolecenie lub bash -c 'cd $HOME/Desktop; touch New_File'utworzyć nowy plik na pulpicie za pomocą skrótu. Jest to szczególnie interesujący przykład, ponieważ możesz użyć zmiennej powłoki, ponieważ używasz powłoki jawnie.


2
Dziękuję bardzo @Serg za szczegółowe wyjaśnienie i udzielenie odpowiedzi na każde pytanie osobno i systematycznie!
ptmdevncoder

@Logan moja przyjemność, zawsze chętnie pomogę :)
Sergiy Kolodyazhnyy

1
Na szczęście źródło wspomnianych narzędzi jest dostępne, ponieważ są FLOSS. Dlatego powiedziałbym, że odwrócenie ich w tym przypadku jest nieco przesadzone. :)
Andrea Lazzarotto

1
@AndreaLazzarotto Yep, Unity Tweak Tool i edytor Dconf - są to oprogramowanie typu open source, więc nie ma potrzeby ich inżynierii wstecznej. W mojej odpowiedzi zachowałem wszystko bardzo ogólne i starałem się objąć nie tylko te narzędzia, ale także inne możliwości
Sergiy Kolodyazhnyy

Szybciej rzadko chodzi o aplikacje GUI. Ucieczka lub uporządkowanie wartości do użycia z narzędziem powłoki jest nużąca, łatwa do pomyłki i bezcelowa, jeśli można po prostu użyć biblioteki. Ponowne debugowanie: Jeśli aplikacja jest zainstalowana z symbolami debugowania i napisana w języku obsługiwanym przez gdb (na debianie, np. Przez zainstalowanie odpowiedniego pakietu -dbg), nie musisz znać asemblera: gdb pokaże ci kod źródłowy za pomocą informacje debugowania podczas przechodzenia przez aplikację. Trudniej będzie znaleźć odpowiedni punkt początkowy do rozpoczęcia debugowania, z powodu nudnego interfejsu GUI.
Jonas Schäfer

21

Szpiegowanie tego, co się dzieje

Większość czynności wykonywanych przez te edytory ustawień można oglądać po uruchomieniu

dconf watch /

w terminalu.

ustawienia

Również przez większość czasu, aby osiągnąć to, co dzieje się z powyższym poleceniem, aplikacje te będą musiały edytować dconfbazę danych (dalej poniżej). Można to zrobić albo bezpośrednio , używając opcji cli dconf (co nie jest preferowane), lub uruchamiając odpowiednie gsettingspolecenia, takie jak wspomniane.

Aby uruchomić te polecenia, nie jest potrzebne okno terminala, jak widać w przykładach.

Informacje, gsettings, dconf i baza danych dconf

gsettingsto frontend cli do dconf, który z kolei edytuje dconfbazę danych, w której przechowywana jest większość ustawień, w formacie binarnym. Zobacz także tę miłą odpowiedź .

dconfBaza danych, nawiasem mówiąc, również mogą być edytowane z GUI za pomocą dconfedytora, który jest w repozytoriach:

wprowadź opis zdjęcia tutaj

Próbki robocze

za. W python

wprowadź opis zdjęcia tutaj

Aby pokazać, co dzieje się pod maską, poniżej działającej próbki, aby przełączyć pozycję programu uruchamiającego z GUI za pomocą jednego przycisku (przełączania):

#!/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()
  • Wklej kod do pustego file.py
  • uruchom go za pomocą polecenia:

    python3 /path/to/file.py
    

...i baw się dobrze.

b. Ikona uruchamiania

Nawet prosty program uruchamiający może wykonać zadanie z GUI:

wprowadź opis zdjęcia tutaj

[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
  • Wklej kod do pustego pliku i zapisz go jako setlauncher.desktop
  • Przeciągnij go do programu uruchamiającego i kliknij prawym przyciskiem myszy

Do stałego użytku przechowuj w ~/.local/share/applications(do użytku lokalnego) lub ~/usr/share/applicationsdla wszystkich użytkowników.


@Logan nie wspominaj o tym :)
Jacob Vlijm
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.