Une application basée sur une interface graphique exécute-t-elle des commandes shell en arrière-plan?

29

J'ai migré vers Ubuntu 16.04 il y a à peine 2 jours à partir de Windows. J'aime la façon dont nous pouvons personnaliser Unity Desktop. Je ne fais que jouer avec l'apparence de l'environnement de bureau. Comme dans Windows, je voulais que le lanceur soit au bas de l'écran. Sur Google, j'ai trouvé une commande qui ressemble à ceci:

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

En outre, il existe les outils Unity-Tweak-Tool et dconf pour mener à bien cette tâche. Mais c’est l’approche graphique pour faire avancer les choses.

Mes questions sont les suivantes:

  • Ces applications basées sur une interface graphique exécutent-elles également la même commande en arrière-plan?
  • Comment avoir un aperçu du fonctionnement interne de ces applications? Je veux dire, y at-il un moyen de regarder les commandes qui sont exécutées à chaque clic de bouton?
  • Ces applications ouvrent-elles un terminal en arrière-plan et exécutent-elles ces commandes?

La réponse ici indique comment s'y prendre. le descripteur de fichier standard du processus. Mais je n'ai rien eu dans la sortie.

De plus, la commande strace -p pid -o output.txt jette une énorme quantité de texte dans le fichier.

En bref, utiliser des applications à interface graphique revient-il à faire des choses à partir de la ligne de commande?

    
posée Logan 14.11.2016 - 12:52
la source

2 réponses

35

Do these GUI-based applications also execute the same command in the background?

Oui et non. Ils écrivent dans la base de données de paramètres dconf , mais ils peuvent utiliser différentes méthodes pour le faire. Les programmes écrits en Python utiliseront probablement le module gi.repository.Gio (je le sais parce que je l’utilise souvent) ou ils peuvent plutôt utiliser gsettings en tant que commande externe en appelant subprocess.Popen(['gsettings','org.some.schema','some-key','value']) , et il s’exécutera essentiellement en tant que commande shell. Un programme C utilisera quelque chose de similaire, probablement une bibliothèque gio.h , ou pourrait même utiliser la famille de fonctions exec() pour faire la même chose que Popen en python. Donc, pour répondre à votre question de titre: "Est-ce que l'application basée sur une interface graphique exécute des commandes shell en arrière-plan?" Ils le peuvent, mais cela n’est probablement pas nécessaire, car il existe une bibliothèque pour la langue dans laquelle l’application est écrite et il sera probablement plus rapide d’utiliser une fonction de bibliothèque que de créer un nouveau processus.

Pour vous donner un exemple de la manière dont vous utilisez les bibliothèques / modules, n'hésitez pas à consulter le code source de mon indicateur de liste de lanceurs. J'ai écrit une fonction pour créer une instance de la classe Gio.Settings , puis l'utiliser pour modifier le lanceur Unity en fonction du type de liste que vous souhaitez y placer.

How to have a peep at the internal working of these applications? I mean, is there any way of actually looking at the commands that are being executed at every click of button?

Non. Si vous voulez voir quelle commande est émise dans le langage de programmation de cette application lorsque vous appuyez sur un bouton ou cliquez sur des éléments de la fenêtre, ce n'est pas possible. Lisez le code source de l'application, s'il est possible de l'obtenir. Vous pouvez utiliser dconf watch / pour voir quels paramètres sont modifiés, mais pas comment procéder.

Techniquement, si vous savez utiliser un débogueur, lire des adresses de mémoire et connaître un langage d'assemblage, vous pouvez savoir ce qu'une application fait sur le processeur et la mémoire. C'est ce que l'on appelle l'ingénierie inverse des logiciels. Les professionnels de la sécurité l'utilisent fréquemment pour analyser les logiciels malveillants et découvrir les vulnérabilités des logiciels légitimes.

Do these applications open up a terminal in the background and execute these commands?

Non, il n'y a pas de terminal attaché. De nombreux programmes savent où se trouve la base de données dconf de l'utilisateur et y écrivent. Il existe également un bus de communication interprocessus appelé dbus , dans lequel les programmes peuvent envoyer des signaux. Un programme ressemblera à "Hey, c'est un message pour moi!"

    
réponse donnée Sergiy Kolodyazhnyy 14.11.2016 - 13:04
la source
21

Espionner ce qui se passe

La plupart des activités de ces éditeurs de paramètres peuvent être visionnées en exécutant

.
dconf watch /

dans un terminal.

paramètres généraux

De même, la plupart du temps, pour obtenir ce que vous voyez avec la commande ci-dessus, ces applications devront éditer la base de données dconf (ci-dessous). Cela peut être fait soit directement , en utilisant les options de la CLI de dconf (ce qui n'est pas préférable ), ou en exécutant les commandes gsettings correspondantes, comme celle que vous avez mentionnée.

Pour exécuter ces commandes, aucune fenêtre de terminal n'est nécessaire, comme vous pouvez le constater dans les exemples.

À propos de, gsettings, dconf et de la base de données dconf

gsettings est l’interface cliente de dconf , qui à son tour édite la base de données dconf , où la plupart des paramètres sont stockés, au format binaire. Voir aussi cette belle réponse .

La base de données dconf , à propos, peut également être modifiée à partir de l'interface graphique par l'éditeur dconf , qui se trouve dans les référentiels:

Échantillonsdetravail

a.Enpython

Pourvousmontrercequisepassesouslecapot,sousunéchantillondetravail,basculezvotrepositiondelanceurdepuisl'interfacegraphiqueenunboutonunique(bascule):

#!/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()
  • Collez le code dans un file.py vide
  • exécutez-le à l'aide de la commande suivante:

    python3 /path/to/file.py
    

... et amusez-vous.

b. Icône du lanceur

Même un simple lanceur peut faire le travail à partir de l'interface graphique:

[DesktopEntry]Name=SetlauncherpositionExec=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
  • Collez le code dans un fichier vide, enregistrez-le sous setlauncher.desktop
  • Faites-le glisser sur le lanceur et cliquez avec le bouton droit de la souris sur
  • .

Pour une utilisation permanente, stockez-la dans ~/.local/share/applications (pour une utilisation locale) ou ~/usr/share/applications pour tous les utilisateurs.

    
réponse donnée Jacob Vlijm 14.11.2016 - 12:56
la source

Lire d'autres questions sur les étiquettes