it-swarm-eu.dev

Jak čistě spouštět GUI aplikaci přes terminál?

Některé aplikace GUI se spouští čistě přes příkazový řádek Terminálu, některé ne, ale způsobují, že Terminál čeká na ukončení aplikace. Dokonce i pak někteří „neuvolňují“ příkazový řádek.

Zdá se, že záhadná přípona ampersand & Způsobuje, že terminál uvedl proces do pozadí (ale nejsem si jistý, co se tam stane).

Existuje způsob, jak spustit aplikaci přes terminál tak, aby nedocházelo k žádnému efektu „viset“, jako když něco spouštíte přes Alt+F2?

Chtěl bych mít okamžitě k dispozici příkazový řádek, aniž by něco zůstalo na pozadí a tisk v terminálu.

81
Peter.O

V případě gedita si nechám pořád kopii otevřenou. Dokud máte spuštěnou existující kopii, spuštění volání gedit z terminálu a uzavření terminálu gedit nezabije.

Pro jiné věci by to, co říkali i ostatní lidé, fungovalo také. Jsem fanouškem Nohup ... Ale pokud potřebujete terminál, můžete se odpojit, ale pak se znovu připojit, chcete se podívat na screen.

  1. Spusťte jej v terminálu a poté spusťte něco, co neustále tlačí výstup. Používám vývojový server Django vývojový server, ale irssi nebo dokonce watch uptime by to byly dobré příklady.
  2. Zabijte terminál a spusťte nový.
  3. Spustit screen -r a BOOM, jste zpět.

screen je mnohem větší a můžete jej kombinovat s byobu pro lepší zážitek z terminálu. Přečtěte si okolí.

17
Oli

Předpokládejme, že gedit je program, který chcete spustit odděleně (aka. "Disowned", "disentangled", "decoupled"). Podle toho, co přesně chcete dělat, existují různé způsoby:

Program již běží

Popřít:

disown -h Je způsob, jak to udělat, pokud to chcete udělat s již spuštěným programem (tj. Pokud jste jej zapomněli Nohup). Nejprve musíte přestat používat Ctrl+Z. Pak můžete vložit na pozadí pomocí bg [jobId] (Např. bg 1). Seznam spuštěných úloh s jejich jobId získáte pomocí jobs. Poté ji můžete odpojit od terminálu pomocí disown -h %[jobId]. Příklad relace terminálu:

$ gedit 
^Z
[1]+  Stopped                 gedit
$ jobs
[1]+  Stopped                 gedit
$ bg 1
[1]+ gedit &
$ disown -h %1
$ exit

Program ještě nebyl spuštěn

Nohup

Nohup není vždy přítomen na všech počítačích. Pokud víte, že se chcete předem oddělit, použijte:

Nohup gedit &

Možná budete chtít také přesměrovat výstup Shell a váš program na pseudo vstupní zdroj, takže: Nohup ./myprogram > foo.out 2> bar.err < /dev/null &. Chtěli byste přesměrovat výstup tak, aby nebyl otráven, nebo jej použít později. Null-vstup může pomoci zabránit hickups v ssh takový.

Subshell:

Podobného účinku můžete dosáhnout

$ (geany >/dev/null 2>&1 &)

Závorky otevírají nový subshell pro spuštění gedit in. >/dev/null 2>&1 Přesměruje výstup Shell nikam (potlačení výstupu). A & Na konci dává tento proces do pozadí.

Terminální multiplexování

Rovněž multiplexování terminálů pomocí screen nebo byob . V podstatě spustíte program v jeho vlastním terminálu. Opravdu mohu doporučit byobu z jiných důvodů. Níže je uveden seznam klávesových zkratek, které by se mohly hodit pro vaše první kroky:

Užitečný:

  • F2 Vytvořte nové okno
  • F3 Přejděte do následujícího okna
  • F4 Přejít na předchozí okno
  • F6 Odpojte se od relace a odhlaste se
  • Shift-F6 Odpojte se od relace, ale neodhlaste se
  • F7 Vstupte do režimu zpětného vyhledávání/vyhledávání
  • Ctrl-F5 Znovu připojte všechny zásuvky nebo agenty SSH/GPG

Méně užitečné:

  • Shift-F2 Rozdělte obrazovku vodorovně
  • Ctrl-F2 Rozdělte obrazovku svisle
  • Shift-F3 Přesuňte zaměření na další rozdělení
  • Shift-F4 Přesuňte zaměření na předchozí rozdělení
  • Shift-F5 Sbalte všechny mezery
  • F5 Obnovte všechna oznámení o stavu
  • F8 Přejmenujte aktuální okno
  • F9 Spusťte nabídku konfigurace Byobu
  • F12 GNU Escape Key Screen)
  • Alt-Pageup Přejděte zpět v historii tohoto okna
  • Alt-Pagedown Posouvejte se v historii tohoto okna dopředu
  • Ctrl-a-! Přepíná a vypíná všechny Byobuovy klíčenky

Démon „at“ a další

at je pěkný užitečný nástroj pro spuštění příkazu v naplánovaném čase. To může být 'zneužito' oddělit příkaz od Shell:

echo './myprogram myoption1 myoption2' | at now

Můžete se také podívat na setsid a start-stop-daemon, Ale ostatní metody by měly stačit.

86
con-f-use

Zdá se, že záhadná přípona ampersand „&“ způsobuje, že terminál dal tento proces do pozadí ... (ale nejsem si jistý, co se tam stane).

To se děje a často to, co chcete. Pokud zapomenete použít &, můžete program pozastavit pomocí ctrl-z, pak jej umístit na pozadí pomocí příkazu bg - a pokračovat v používání tohoto prostředí.

Proces 'stdin, stdout a stderr jsou stále připojeny k terminálu; můžete je přesměrovat z/do/dev/null nebo z jakéhokoli jiného souboru (např. někde uložit výstupní protokol):

some-program </dev/null &>/dev/null &
# &>file is bash for 1>file 2>&1

Můžete vidět proces v úlohách, přivést ho zpět do popředí (příkaz fg) a odeslat jej signály (příkaz kill).

Některé grafické programy se od terminálu odpojí; pokud je tomu tak, při spuštění příkazu „normálně“ si všimnete, že spustí grafický program a „ukončí“.


Zde je krátký skript , můžete jej umístit do ~/bin , kterému jsem pojmenoval runbg:

#!/bin/bash
[ $# -eq 0 ] && {  # $# is number of args
  echo "$(basename $0): missing command" >&2
  exit 1
}
prog="$(which "$1")"  # see below
[ -z "$prog" ] && {
  echo "$(basename $0): unknown command: $1" >&2
  exit 1
}
shift  # remove $1, now $prog, from args
tty -s && exec </dev/null      # if stdin is a terminal, redirect from null
tty -s <&1 && exec >/dev/null  # if stdout is a terminal, redirect to null
tty -s <&2 && exec 2>&1        # stderr to stdout (which might not be null)
"$prog" "[email protected]" &  # [email protected] is all args

Vyhledám program ($ prog) před přesměrováním, takže chyby v jeho nalezení mohou být nahlášeny. Spusťte ji jako "runbg your-command args ..."; stále můžete přesměrovat stdout/err do souboru, pokud potřebujete někde uložit výstup.

Kromě přesměrování a zpracování chyb je to ekvivalent htorqueova odpověď .

25
Roger Pate

Chcete-li spustit aplikaci a odpojit ji od spuštěného terminálu, použijte & !.

firefox &!
23
Rick

Použít Nohup

Nohup je program, který spouští daný příkaz se ignorovanými signály zavěšení, takže tento příkaz může pokračovat v běhu na pozadí i po ukončení nadřazeného procesu. Viz manpage

Například:

Nohup gedit something
20
Florian Diesch

Otevřete terminál, zadejte obrazovka, zadejte příkaz, který chcete spustit, zavřete terminál. Program by měl pokračovat v relaci GNU obrazovka.

4
RobinJ

To pro mě fungovalo:

$ (Nohup gedit 2>/dev/null &)
1
wesleycoder

xdg-open

Podívejte se na tento univerzální nástroj: https://linux.die.net/man/1/xdg-open

Tím se ve správci souborů otevře relativní umístění.

 $ xdg-open .

Tím se otevře soubor PDF v čtečce PDF.

 $ xdg-open foo.pdf

Můžete dokonce zadat webové adresy URL

$ xdg-open www.google.com
1
Jonathan Komar

Jak mnoho lidí napadlo, Nohup je věc, kterou je třeba zvážit. Nohupové statické snímky však zůstávají otevřené na terminálu a zobrazují programovou aktivitu na terminálu, která dráždí. Poté můžete terminál zavřít, abyste tomu zabránili. Zjistil jsem velmi jednoduché řešení, které používám.

Nohup gedit & exit

A to je vše. Když se spustí gedit, otevře gedit a uzavře terminál. Protože gedit není nyní s terminálem spojen, zůstává aktivní.

0
Lokesh Devnani

Funguje to i uvnitř skriptu (Stejně jako u aliasu není přívěsek „&“ ve skriptech obvykle povolen, protože nejsou interaktivní):

bash -i >/dev/null 2>&1 <<<'Nohup gedit &'
0
Sam

To pro mě fungovalo:

$ (some-program &) &>/dev/null

# Examples:
$ (gedit &) &>/dev/null
$ (google-chrome &) &>/dev/null
0
Eyal Levin