Чи виконує додаток на основі GUI команди оболонок у фоновому режимі?


29

Я перейшов на Ubuntu 16.04 лише 2 дні тому з Windows. Мені подобається, як ми можемо налаштувати Unity Desktop. Я просто розігруюсь із зовнішнім виглядом середовища Desktop. Як і в Windows, я хотів, щоб пускова установка знаходилася внизу екрана. На Googling я знайшов команду, яка виглядає так:

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

Крім того, існують інструмент юнит-tweak-інструмент та редактор dconf, щоб виконати роботу. Але це графічний підхід до виконання справ.

Мої запитання:

  • Чи ці програми на основі GUI також виконують ту саму команду у фоновому режимі?
  • Як заглянути у внутрішню роботу цих додатків? Я маю на увазі, чи є якийсь спосіб насправді переглянути команди, які виконуються при кожному натисканні кнопки?
  • Чи відкривають ці програми термінал у фоновому режимі і виконують ці команди?

Відповідь тут розповідає, як отримати стандартний дескриптор файлу процесу. Але я нічого не отримав у висновку.

Більше того, strace -p pid -o output.txtкоманда кидає у файл величезну кількість тексту.

Отже, коротше, чи робиться те, що використовує програми GUI, те саме, що робити речі з командного рядка?

Відповіді:


35

Чи ці програми на основі GUI також виконують ту саму команду у фоновому режимі?

Так і ні. Вони записують у dconfбазу даних налаштувань, але для цього вони можуть використовувати різні способи. Програми, написані на Python, швидше за все, використовуватимуть gi.repository.Gioмодуль (я знаю, тому що я його дуже багато використовую), або вони можуть замість цього використовувати gsettingsяк зовнішню команду шляхом виклику subprocess.Popen(['gsettings','org.some.schema','some-key','value']), і в основному вона буде працювати як команда оболонки. Програма змінного струму використовуватиме щось подібне, ймовірно, gio.hбібліотеку, або навіть може використовувати exec()сімейство функцій, щоб зробити те саме, що Popenі в python. Отже, щоб відповісти на ваше заголовкове запитання: "Чи виконує програма на основі GUI команди оболонок у фоновому режимі?" Вони можуть, але, ймовірно, це не потрібно, тому що існує бібліотека для будь-якої мови, на якій написано додаток, і, ймовірно, використовувати функцію бібліотеки буде трохи швидше, ніж нерестувати новий процес.

Щоб дати вам зразок того, як це робиться з бібліотеками / модулями, сміливо перегляньте вихідний код індикатора мого списку запуску. Там я написав функцію створити екземпляр Gio.Settingsкласу, а потім використовувати його для зміни запуску Unity залежно від типу списку, який ви хочете там мати.

Як заглянути у внутрішню роботу цих додатків? Я маю на увазі, чи є якийсь спосіб насправді переглянути команди, які виконуються при кожному натисканні кнопки?

Ні. Якщо ви хочете побачити, яка команда видається мовою програмування цього додатка, натискаючи кнопку або клацаючи на елементах вікна, тоді це неможливо. Прочитайте вихідний код програми, якщо є можливість її отримати. Ви можете використовувати, dconf watch /щоб побачити, які налаштування змінюються, але не як це робиться.

Технічно, якщо ви знаєте, як керувати налагоджувачем, читати адреси пам’яті та знати деяку мову складання, то ви можете знати, що робить програма на рівні процесора та пам’яті. Це відоме як зворотне проектування програмного забезпечення, і його часто використовують фахівці з безпеки для аналізу шкідливого програмного забезпечення та виявлення вразливих місць законного програмного забезпечення.

Чи відкривають ці програми термінал у фоновому режимі і виконують ці команди?

Ні, терміналу не додано. Багато програм знають, де знаходиться dconfбаза даних для користувача і там пишуть. Існує також міжпроцесорна комунікаційна шина, яка називається dbus, де програми можуть надсилати сигнали, і програма буде на зразок "Гей, це повідомлення для мене!"

Додаток

  • Чи можуть додатки запускати інші програми? Так, це робиться за допомогою стандартних fork()та execve()системних дзвінків. Суть створення процесів у Linux та інших * nix системах багато в чому базується на цих двох. Механізм оболонки для запуску невбудованих команд використовує саме це, зокрема. Коли ви запускаєте інтерактивно

    $ ls 
    

    оболонка створить новий процес через fork(), той процес буде запущений, execve() який почнеться ls. Через те execve(), яким буде цей новий розгалужений процес ls. pipe()Системний виклик , що допоможе лічений виходу ls. Я настійно пропоную прочитати свою відповідь на те, яка різниця між трубою і перенаправленням, щоб зрозуміти, як працює механізм труби - це не просто |оператор, а насправді систематичний виклик.

  • Чи можуть програми запускати команди оболонки? Ні. Синтаксис оболонки розуміється лише самою оболонкою. Однак ви можете запустити оболонку за допомогою -cперемикача командного рядка та надати відповідні команди. Це часто використовується для спеціальних ярликів, встановлених у GNOME або інших робочих середовищах, оскільки користувацькі ярлики працюють на виконуваних файлах і немає оболонки для розуміння синтаксису. Таким чином, як приклад, ви б зробили, bash -c 'xdotool key Ctrl+Alt+T'щоб побічно запустити xdotoolкоманду або bash -c 'cd $HOME/Desktop; touch New_File'створити новий файл на робочому столі за допомогою ярлика. Це особливо цікавий приклад, оскільки ви можете використовувати змінну оболонки, оскільки явно ви використовуєте оболонку.


2
Дуже дякую @Serg за детальне пояснення та відповіді на кожне питання окремо та систематично!
ptmdevncoder

@Logan моє задоволення, завжди радий допомогти :)
Сергій Колодяжний

1
На щастя, джерело для згаданих інструментів є, оскільки вони FLOSS. Тому я б сказав, що повернення їх у цьому випадку є дещо зайвим. :)
Андреа Лаццаротто

1
@AndreaLazzarotto Yep, інструмент Tweak Unity та редактор Dconf - це відкритий код, тому не потрібно реверсувати їх. У своїй відповіді я тримав усе дуже загальне і намагався охопити не лише ті інструменти, а й інші можливості
Сергій Колодяжний

Швидше рідко стає точкою для GUI-додатків. Уникнення або маршалінг значень для використання з інструментом оболонки стомлюючий, легко помилитися і безглуздо, якщо ви можете просто використовувати бібліотеку. Повторна налагодження: Якщо програма встановлена ​​із символами налагодження та написана мовою, що підтримується gdb (на debian, наприклад, встановлення відповідного пакета -dbg), вам не потрібно знати асемблера: gdb покаже вам вихідний код за допомогою інформація про налагодження під час перегляду програми. Що буде складніше, це знайти належну точку входу, щоб почати налагодження з-за нудної графічної панелі GUI.
Йонас Шефер

21

Шпигунство за тим, що відбувається

Більшість з цих редакторів налаштувань можна спостерігати за допомогою запуску

dconf watch /

в терміналі.

виїмки

Крім того, більшу частину часу, щоб досягти того, що ви бачите з командою вище, цим програмам потрібно буде редагувати dconfбазу даних (далі нижче). Це можна зробити безпосередньо , використовуючи параметри cli dconf (який не є кращим), або виконавши відповідні gsettingsкоманди, як та, яку ви згадуєте.

Для виконання цих команд не потрібне вікно терміналу, як ви бачите в прикладах.

Про, gsettings, dconf та базу даних dconf

gsettingsце фронтенд cli dconf, який, в свою чергу, редагує dconfбазу даних, де зберігається більшість налаштувань, у двійковому форматі. Дивіться також цю приємну відповідь .

dconfБази даних, до речі, також можуть бути змінені за допомогою графічного інтерфейсу з допомогою dconfредактора, який знаходиться в сховищах:

введіть тут опис зображення

Робочі зразки

а. В пітоні

введіть тут опис зображення

Щоб показати вам, що відбувається під кришкою, під робочим зразком, щоб переключити позицію запуску з графічного інтерфейсу однією кнопкою:

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

... і весело провести час.

б. Піктограма запуску

Навіть простий пусковий апарат може виконати роботу з графічного інтерфейсу:

введіть тут опис зображення

[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 це не згадую :)
Яків Влійм
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.