Wie säubere ich eine GUI-App über das Terminal (damit es nicht auf die Beendigung wartet)?

68

Einige GUI-Apps werden über die Terminal-Befehlszeile sauber gestartet.

Einige tun dies nicht und verursachen, dass das Terminal auf das Beenden der App wartet.
... und selbst dann "entlasten" einige die Befehlszeile nicht.

Das mysteriöse Ampersand "& amp;" Suffix, scheint das Terminal dazu zu bringen, den Prozess in den Hintergrund zu stellen ... (aber ich bin mir nicht sicher, was dort passiert).

Gibt es eine Möglichkeit, eine App über das Terminal zu starten, sodass es keinen "Hang-on" -Effekt gibt? ... wie etwas über F2 zu starten.

Ich möchte die Kommandozeile sofort wieder verfügbar haben (ohne etwas im Hintergrund zu haben und eine Systemmeldung im Terminal zu schreiben).

    
Peter.O 31.10.2010, 11:50

10 Antworten

17

Im Fall von gedit bleibe ich ständig eine Kopie offen. Solange Sie eine vorhandene Kopie ausgeführt haben, startet gedit Anrufe vom Terminal und schließt dann das Terminal nicht gedit.

Für andere Dinge, was andere Leute gesagt haben, würde auch funktionieren. Ich bin ein Fan von nohup ... Aber wenn du ein Terminal brauchst, das du lösen und dann wieder anhängen kannst, solltest du screen sehen.

  1. Führen Sie es in einem Terminal aus und führen Sie dann etwas aus, das die Ausgabe weitergibt. Ich benutze den Django-Entwicklungsserver, aber irssi oder sogar watch uptime wären gute Beispiele.
  2. Töte das Terminal und starte ein neues.
  3. Führe screen -r und BOOM aus, du bist wieder da.

screen ist viel größer als das und du kannst es mit byobu kombinieren, um ein besseres Terminal-Erlebnis zu erhalten. Lesen Sie sich um.

    
Oli 31.05.2011, 14:25
79

Angenommen, gedit ist das Programm, das Sie losgelöst ausführen möchten (aka. "disown", "disentangle", "decouple"). Je nachdem, was Sie genau machen möchten, gibt es verschiedene Möglichkeiten:

Programm läuft bereits

Disown:

disown -h ist der Weg zu gehen, wenn Sie das mit einem bereits laufenden Programm machen wollen (d. h. wenn Sie nohup it vergessen haben). Sie müssen es zuerst mit Strg + Z stoppen. Dann können Sie mit bg [jobId] (z. B. bg 1 ) in den Brackground einsteigen. Sie erhalten eine Liste der laufenden Jobs mit ihrer Job-ID mit jobs . Danach können Sie ihn mit disown -h %[jobId] vom Terminal abkoppeln. Beispiel für eine Terminalsitzung:

confus@confusion:~$ gedit 
^Z
[1]+  Stopped                 gedit
confus@confusion:~$ jobs
[1]+  Stopped                 gedit
confus@confusion:~$ bg 1
[1]+ gedit &
confus@confusion:~$ disown -h %1
confus@confusion:~$ exit

Programm noch nicht gestartet

nohup

nohup ist nicht immer auf allen Computern vorhanden. Wenn Sie wissen, dass Sie vorher entkoppeln möchten, verwenden Sie:

nohup gedit &

Vielleicht möchten Sie auch die Shell-Ausgabe umleiten und Ihr Programm eine Pseudo-Eingangsquelle, also: nohup ./myprogram > foo.out 2> bar.err < /dev/null & . Sie möchten die Ausgabe umleiten, um entweder nicht verärgert zu sein oder sie später zu verwenden. Die Null-Eingabe kann dazu beitragen, Schlupf in ssh und so zu verhindern.

Unterschale:

Sie können einen ähnlichen Effekt durch

erzielen
confus@confusion:~$ (geany 2>&1 /dev/null &)

Die Klammern öffnen eine neue Subshell, in der gedit ausgeführt wird. 2>&1 /dev/null leitet die Shell-Ausgabe nach nirgendwo um (Unterdrückung der Ausgabe). Und das & am Ende stellt den Prozess in den Hintergrund.

Terminal-Multiplexing

Auch Terminal-Multiplexing mit Bildschirm oder byobu . Sie führen das Programm grundsätzlich in einem eigenen Terminal aus. Ich kann byobu auch aus anderen Gründen empfehlen. Unten finden Sie eine Liste von boybu-Verknüpfungen, die für Ihre ersten Schritte nützlich sein könnten:

Nützlich:

  • F2 Erstellen Sie ein neues Fenster
  • F3 Zum nächsten Fenster wechseln
  • F4 Zum vorherigen Fenster wechseln
  • F6 Trennen Sie sich von der Sitzung und melden Sie sich ab
  • Shift-F6 Trennen Sie sich von der Sitzung, aber melden Sie sich nicht ab
  • F7 Scrollback / Suchmodus eingeben
  • Strg-F5 Erneutes Verbinden aller SSH / GPG-Sockets oder Agenten

Weniger nützlich:

Shift-F2 Teilen Sie den Bildschirm horizontal - Strg-F2 Teilen Sie den Bildschirm vertikal - Shift-F3 Fokus auf die nächste Teilung verschieben - Shift-F4 Fokus auf die vorherige Teilung verschieben - Shift-F5 Alle Splits reduzieren - F5 Aktualisieren Sie alle Statusbenachrichtigungen - F8 Benennt das aktuelle Fenster um - F9 Starten Sie das Byobu-Konfigurationsmenü - F12 GNU Screen Escape Key - Alt-Pageup Scrolle zurück durch den Verlauf dieses Fensters - Alt-Pagendown Scrolle vorwärts durch die Historie dieses Fensters - Strg-a -! Schaltet alle Tastaturbelegungen von Byobu ein oder aus -

Das 'at' deamon und andere

at ist ein nützliches kleines Werkzeug, um einen Befehl zu einem geplanten Zeitpunkt auszuführen. Es kann "missbraucht" werden, um einen Befehl von der Shell zu lösen:

echo './myprogram myoption1 myoption2' | at now

Sie können auch in setsid und start-stop-daemon schauen, aber die anderen Methoden sollten ausreichen.

    
con-f-use 31.05.2011 14:28
25
  

Das mysteriöse Ampersand "& amp;" Suffix, scheint das Terminal zu veranlassen, den Prozess in den Hintergrund zu stellen ... (aber ich bin mir nicht sicher, was dort passiert).

Es tut es und ist oft das, was Sie wollen. Wenn Sie die Verwendung von & amp; vergessen, können Sie das Programm mit ctrl-z aussetzen und es dann mit dem Befehl bg in den Hintergrund stellen - und weiterhin diese Shell verwenden.

Der Prozess 'stdin, stdout und stderr sind immer noch mit dem Terminal verbunden; Sie können diese von / nach / dev / null oder einer anderen Datei (z. B. ein Ausgabeprotokoll irgendwo speichern) wie gewünscht umleiten:

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

Sie können den Prozess in Jobs sehen, ihn wieder in den Vordergrund bringen (Befehl fg) und ihm Signale senden (Befehl kill).

Einige grafische Programme werden vom Terminal getrennt; Wenn dies der Fall ist, wenn Sie den Befehl "normal" ausführen, werden Sie feststellen, dass das grafische Programm gestartet und "beendet" wird.

Hier ist ein kurzes Skript , das Sie in ~/bin , die ich runbg genannt habe:

#!/bin/bash
[ $# -eq 0 ] && {  # $# is number of args
  echo "$(basename %pre%): missing command" >&2
  exit 1
}
prog="$(which "")"  # see below
[ -z "$prog" ] && {
  echo "$(basename %pre%): unknown command: " >&2
  exit 1
}
shift  # remove , 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" "$@" &  # $@ is all args

Ich lese das Programm ($ prog) vor dem Umleiten nach, so dass Fehler beim Auffinden gemeldet werden können. Führen Sie es als "runbg your-command args ..."; Sie können stdout / err immer noch in eine Datei umleiten, wenn Sie die Ausgabe irgendwo speichern müssen.

Abgesehen von den Umleitungen und der Fehlerbehandlung entspricht dies htorques Antwort .

    
Roger Pate 31.10.2010 12:25
20

Verwenden Sie nohup

  

nohup ist ein Programm, das einen gegebenen Befehl mit Hangup-Signalen ausführt   ignoriert, damit der Befehl im Hintergrund weiter ausgeführt werden kann   nachdem der Elternprozess beendet wurde. Siehe die Hilfeseite

Zum Beispiel:

nohup gedit something
    
Florian Diesch 31.05.2011 14:10
18

Um eine Anwendung zu starten und sie vom gestarteten Terminal zu trennen, verwenden Sie & amp;!.

firefox &!
    
Rick 31.10.2010 13:20
4

Öffnen Sie das Terminal, geben Sie screen ein, geben Sie den Befehl ein, den Sie ausführen möchten, und schließen Sie das Terminal. Das Programm sollte in der Sitzung GNU Screen weiterlaufen.

    
RobinJ 31.05.2011 17:00
1

Das hat für mich funktioniert:

$ (nohup gedit 2>/dev/null &)
    
wesleycoder 31.12.2012 00:20
0

Wie viele Leute angenommen haben, ist Nohup das Richtige. Aber nohup stills bleibt auf dem Terminal offen und zeigt die Programmaktivität auf dem Terminal an, was irritiert. Sie können das Terminal einfach schließen, um dies zu vermeiden. Ich habe eine sehr einfache Lösung gefunden, die ich benutze.

nohup gedit & exit

Und das ist es. Es öffnet gedit und schließt das Terminal, wenn gedit gestartet wird. Da gedit jetzt nicht mit dem Terminal verbunden ist, bleibt es aktiv.

    
Lokesh Devnani 03.09.2015 19:25
0

Dies funktioniert sogar innerhalb eines Skripts (Wie Aliase ist der '& amp;' - Trailer in Skripten normalerweise nicht erlaubt, da sie nicht interaktiv sind):

bash -i >/dev/null 2>&1 <<<'nohup gedit &'
    
Sam 02.01.2018 20:40
0

Das hat für mich funktioniert:

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

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

Tags und Links