GNU/Linux >> Znalost Linux >  >> Ubuntu

Spouští aplikace založená na Gui příkazy Shell na pozadí?

Z Windows jsem před 2 dny migroval na Ubuntu 16.04. Líbí se mi způsob, jakým si můžeme přizpůsobit plochu Unity. Jen si hraji se vzhledem a dojmem prostředí Desktop. Stejně jako ve Windows jsem chtěl, aby spouštěč byl ve spodní části obrazovky. Na Googlu jsem našel příkaz, který vypadá takto:

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

K dispozici je také nástroj unity-tweak a editor dconf, který tuto práci zvládne. Ale toto je přístup GUI, jak věci dokončit.

Moje otázky jsou:

  • Provádějí tyto aplikace založené na grafickém uživatelském rozhraní také stejný příkaz na pozadí?
  • Jak nahlédnout do interního fungování těchto aplikací? Chci říct, existuje nějaký způsob, jak se skutečně podívat na příkazy, které se provádějí při každém kliknutí na tlačítko?
  • Otevírají tyto aplikace terminál na pozadí a provádějí tyto příkazy?

Odpověď zde říká, jak získat standardní deskriptor souboru procesu. Ale ve výstupu jsem nic nedostal.

Navíc strace -p pid -o output.txt příkaz hodí do souboru obrovské množství textu.

Takže, stručně řečeno, je dělat věci pomocí GUI aplikací stejné jako dělat věci z příkazového řádku?

Přijatá odpověď:

Provádějí tyto aplikace založené na GUI také stejný příkaz na pozadí?

Ano i ne. Zapisují do dconf databáze nastavení, ale mohou k tomu používat různé způsoby. Programy napsané v Pythonu budou pravděpodobně používat gi.repository.Gio modul (vím, protože ho často používám) nebo mohou místo toho použít gsettings jako externí příkaz voláním subprocess.Popen(['gsettings','org.some.schema','some-key','value']) a bude v podstatě běžet jako příkaz shellu. C program bude používat něco podobného, ​​pravděpodobně gio.h knihovna nebo může dokonce používat exec() rodina funkcí dělat to samé jako Popen dělá v pythonu. Abychom odpověděli na vaši titulní otázku:„Provádějí aplikace založené na GUI příkazy shellu na pozadí? Mohou, ale pravděpodobně to není nutné, protože existuje knihovna pro jakýkoli jazyk, ve kterém je aplikace napsána, a pravděpodobně bude o něco rychlejší použít funkci knihovny než vytvořit nový proces.

Chcete-li vám poskytnout ukázku toho, jak se to dělá s knihovnami/moduly, neváhejte se podívat na zdrojový kód mého indikátoru seznamu spouštěčů. Tam jsem napsal funkci pro vytvoření instance Gio.Settings class a poté jej použijte k úpravě spouštěče Unity v závislosti na typu seznamu, který tam chcete mít.

Jak nahlédnout do vnitřního fungování těchto aplikací? Chci říct, existuje nějaký způsob, jak se skutečně podívat na příkazy, které se provádějí při každém kliknutí na tlačítko?

Ne. Pokud chcete vidět, který příkaz je vydán v programovacím jazyce dané aplikace, když stisknete tlačítko nebo kliknete na prvky okna, pak to není možné. Přečtěte si zdrojový kód aplikace, pokud je možné jej získat. Můžete použít dconf watch / abyste viděli, jaká nastavení se mění, ale ne jak se to dělá.

Související:Windows 8 se po instalaci Ubuntu s opravou spouštění nespustí přes GRUB?

Technicky vzato, pokud víte, jak pracovat s debuggerem, číst adresy paměti a znáte nějaký jazyk symbolických instrukcí, můžete vědět, co aplikace dělá na úrovni CPU a paměti. Toto je známé jako softwarové reverzní inženýrství a je často používáno bezpečnostními profesionály k analýze škodlivého softwaru a odhalování zranitelností v legitimním softwaru.

Otevírají tyto aplikace terminál na pozadí a provádějí tyto příkazy?

Ne, není připojen žádný terminál. Mnoho programů ví, kde je dconf se nachází databáze pro uživatele a zapište se tam. Existuje také meziprocesová komunikační sběrnice známá jako dbus , kde programy mohou vysílat signály a program bude vypadat jako „Hej, to je zpráva pro mě!“

Dodatek

  • Mohou aplikace spouštět jiné aplikace? Ano, to se provádí pomocí standardního fork() a execve() systémová volání. Podstata vytváření procesů na Linuxu a dalších *nix systémech je z velké části založena na těchto dvou. Shell mechanismus pro spouštění nezabudovaných příkazů toho hodně využívá. Když spustíte interaktivně

    $ ls 
    

    shell vytvoří nový proces pomocí fork() , tento proces spustí execve() který spustí ls . Kvůli tomu, jak execve() tento nový rozvětvený proces bude ls . pipe() systémové volání pomůže přečíst zpět výstup ls . Důrazně doporučuji přečíst si svou odpověď na otázku Jaký je rozdíl mezi potrubím a přesměrováním, abyste pochopili, jak funguje mechanismus potrubí – není to jen | operátor, ale ve skutečnosti systémové volání.

  • Mohou aplikace spouštět příkazy shellu? Ne. Syntaxi shellu rozumí pouze samotný shell. Co však můžete udělat, je spustit shell pomocí příkazového řádku -c přepnout a poskytnout příslušné příkazy. To se často používá pro vlastní zkratky nastavené v GNOME nebo jiných desktopových prostředích, protože vlastní zkratky fungují se spustitelnými soubory a neexistuje žádný shell, který by porozuměl syntaxi. Jako příklad byste tedy udělali bash -c 'xdotool key Ctrl+Alt+T' nepřímo spustit xdotool příkaz nebo bash -c 'cd $HOME/Desktop; touch New_File' pro vytvoření nového souboru na ploše pomocí zástupce. Toto je obzvláště zajímavý příklad, protože můžete použít proměnnou shellu, protože používáte shell explicitně.


Ubuntu
  1. Soubor .desktop. Došlo k chybě při spouštění aplikace?

  2. 5 způsobů, jak spouštět příkazy UNIX / Linux (a skripty Shell) na pozadí

  3. Pochopení příkazů řízení úloh v Linuxu – bg, fg a CTRL+Z

  1. Přizpůsobení Bash Shell:Tučné/barva Příkaz?

  2. Spouštějte příkazy Shell z programu spuštěného ve WINE

  3. Jak mohu skrýt výstup shellové aplikace v Linuxu?

  1. Jak začít potopu na pozadí?

  2. Jak spouštět příkazy v Gnuplot pomocí skriptu Shell?

  3. Asynchronní příkazy shellu