Основанное на GUI приложение выполняет команды оболочки в фоновом режиме?

Я мигрировал на Ubuntu 16.04 всего 2 дня назад из Windows. Мне нравится способ, которым мы можем настроить Рабочий стол Единицы. Я просто играю вокруг со стилем Настольной среды. Точно так же, как в Windows, я хотел, чтобы средство запуска было внизу экрана. На поиске с помощью Google я нашел команду, которая идет как:

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

Кроме того, существует инструмент тонкой настройки единицы и dconf редактор, чтобы сделать задание. Но это подход GUI добивания цели.

Мои вопросы:

  • Эти основанные на GUI приложения также выполняют ту же команду в фоновом режиме?
  • Как посмотреть на внутреннюю работу этих приложений? Я имею в виду, там какой-либо способ фактического рассмотрения команд, которые выполняются при каждом щелчке кнопки?
  • Эти приложения открывают терминал в фоновом режиме и выполняют эти команды?

Ответ здесь говорит, как получить стандартный дескриптор файла процесса. Но, я ничего не получил в выводе.

Кроме того, strace -p pid -o output.txt управляйте бросает огромную сумму текста в файл.

Так, короче говоря, выполнение вещей использует приложения GUI то же как выполнение материала от командной строки?

29
задан 13 April 2017 в 05:25

2 ответа

Эти основанные на GUI приложения также выполняют ту же команду в фоновом режиме?

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

Чтобы дать Вам образец того, как это сделано с библиотеками/модулями, не стесняйтесь смотреть на исходный код моего индикатора списка средства запуска. Там я записал функцию для создания экземпляра Gio.Settings класс и затем использует его для изменения средства запуска Единицы в зависимости от типа списка, который Вы хотите иметь там.

Как посмотреть на внутреннюю работу этих приложений? Я имею в виду, там какой-либо способ фактического рассмотрения команд, которые выполняются при каждом щелчке кнопки?

Нет. Если Вы хотите видеть, какая команда дается на языке программирования того приложения, поскольку Вы нажимаете кнопку или нажимаете на элементы окна, то это не возможно. Считайте исходный код приложения, если возможно получить его. Можно использовать dconf watch / видеть, какие настройки изменяются, но не, как это сделано.

Технически, если Вы знаете, как управлять отладчиком, считайте адреса памяти и знайте некоторый ассемблер, затем можно знать то, что приложение делает на уровне памяти и ЦП. Это известно как инженерный анализ программного обеспечения и часто используется специалистами по безопасности, чтобы проанализировать вредоносное программное обеспечение и обнаружить уязвимости в законном программном обеспечении.

Эти приложения открывают терминал в фоновом режиме и выполняют эти команды?

Нет, нет никакого присоединенного терминала. Много программ знают где dconf база данных для пользователя расположена, и запишите там. Существует также шина межпроцессного взаимодействия, известная как dbus, куда программы могут отправить сигналы, и программа будет похожа "Эй, это - сообщение для меня!"

Приложение

  • Приложения могут запустить другие приложения? Да, это сделано с помощью стандарта fork() и execve() системные вызовы. Сущность создания процессов на Linux и другом *отклоняет системы, в основном основан на этих двух. Механизм Shell для выполнения невстроенного использования команд, что много в частности. Когда Вы работаете в интерактивном режиме

    $ ls 
    

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

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

35
ответ дан 23 November 2019 в 00:51

Шпионаж за тем, что происходит

За большей частью того, что делают эти редакторы настроек, можно наблюдать путем выполнения

dconf watch /

в терминале.

gsettings

Также большую часть времени, для достижения, что Вы видите случай с командой выше эти приложения должны будут отредактировать dconf база данных (далее ниже). Это может быть сделано любой непосредственно, при помощи cli опций dconf (который не предпочтен), или путем выполнения соответствия gsettings команды, как та Вы упоминаете.

Для выполнения этих команд никакое окно терминала не необходимо, как Вы видите в примерах.

О, gsettings, dconf и dconf база данных

gsettings cli frontend к dconf, который в свою очередь редактирует dconf база данных, где большинство настроек хранится в двоичном формате. См. также этот хороший ответ.

dconfбаза данных, между прочим, может также быть отредактирована от GUI dconf редактор, который находится в репозиториях:

enter image description here

Рабочие образцы

a. В Python

enter image description here

Чтобы показать Вам, что, оказывается, под капотом ниже рабочего образца переключает Ваше положение средства запуска от 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
    

... и весело проведите время.

b. Значок Launcher

Даже простое средство запуска может сделать задание от GUI:

enter image description here

[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 для всех пользователей.

21
ответ дан 23 November 2019 в 00:51

Другие вопросы по тегам:

Похожие вопросы: