Einige GUI-Apps werden über die Terminal-Befehlszeile sauber gestartet, andere jedoch nicht, und das Terminal wartet darauf, dass die App beendet wird. Selbst dann "geben" manche die Befehlszeile nicht frei.
Das mysteriöse kaufmännische Und- &
Suffix scheint das Terminal dazu zu veranlassen, den Prozess in den Hintergrund zu stellen (aber ich bin nicht sicher, was dort passiert).
Gibt es eine Möglichkeit, eine App über das Terminal zu starten, so dass es keinen "Hang on" -Effekt gibt, genau wie das Starten von etwas über Alt+ F2?
Ich möchte die Kommandozeile sofort wieder zur Verfügung haben, ohne dass noch etwas im Hintergrund ist und im Terminal gedruckt wird.
command-line
gui
Peter.O
quelle
quelle
screen
(von Oli erwähnt) und RobinJ). Ich bin beeindruckt von seiner Fähigkeit; nachdem darüber zu lesen und zu versuchen , es aus ... Es erfordert nur die Eingabe von:screen -d -m gedit
(oderscreen gedit
dannCtrl+a d
zu lösen) ... und ich habe immer noch vollen Zugang zum Terminal nach Ansicht des gedit (für Nachrichten usw. Warnung) jederzeit über ,screen -r
auch wenn ich habe in der Zwischenzeit das ursprüngliche Terminalfenster geschlossen ...&
Befehlssuffix. Dies kann zur Verdeutlichung hilfreich sein: Was ist der Unterschied zwischen Terminal, Konsole, Shell und Befehlszeile?Antworten:
In gedit's Fall lasse ich einfach eine Kopie die ganze Zeit offen. Solange eine vorhandene Kopie ausgeführt wird,
gedit
wird gedit nicht beendet, wenn Sie Anrufe vom Terminal aus starten und dann das Terminal schließen.Für andere Dinge würde das, was andere Leute gesagt haben, auch funktionieren. Ich bin ein Fan von
nohup
... Aber wenn Sie ein Terminal benötigen, das Sie abnehmen und dann wieder anbringen können, möchten Sie es sich ansehenscreen
.irssi
oderwatch uptime
wäre sogar ein gutes Beispiel.screen -r
und BOOM, du bist wieder da.screen
ist viel größer als das und Sie können esbyobu
für ein besseres Terminal-Erlebnis mit kombinieren . Lies herum.quelle
Angenommen,
gedit
das Programm, das Sie ausführen möchten, ist nicht verbunden (auch bekannt als "disowned", "disentangled", "decoupled"). Es gibt verschiedene Möglichkeiten, je nachdem, was Sie genau tun möchten:Programm läuft bereits
Verleugnen:
disown -h
ist der richtige Weg, wenn Sie dies mit einem bereits laufenden Programm tun möchten (dh wenn Sie es vergessennohup
haben). Sie müssen es zuerst mit Ctrl+ stoppen Z. Dann können Sie mitbg [jobId]
(zBbg 1
) in den Hintergrund stellen . Sie erhalten eine Liste der ausgeführten Jobs mit der Job-ID, die verwendet wirdjobs
. Danach können Sie es mit vom Terminal abkoppelndisown -h %[jobId]
. Beispiel für eine Terminalsitzung:Programm noch nicht gestartet
Nohup
nohup
ist nicht immer auf allen Maschinen vorhanden. Wenn Sie wissen, dass Sie vorab entkoppeln möchten, verwenden Sie:Vielleicht möchten Sie die Shell - Ausgabe als auch und Ihr Programm eine Pseudo - Eingangsquelle umgeleitet werden , so:
nohup ./myprogram > foo.out 2> bar.err < /dev/null &
. Sie möchten die Ausgabe umleiten, um entweder nicht gestört zu werden oder um sie später zu verwenden. Die Null-Eingabe kann helfen, Fehler in ssh und so zu vermeiden.Unterschale:
Sie können einen ähnlichen Effekt erzielen, indem Sie
Die eckigen Klammern öffnen eine neue Subshell, in der gedit ausgeführt wird. Die
>/dev/null 2>&1
Shell leitet die Ausgabe an einen anderen Ort weiter (unterdrückt die Ausgabe). Und&
am Ende rückt der Prozess in den Hintergrund.Terminal-Multiplexing
Auch Terminal-Multiplexing über Bildschirm oder Byobu . Sie führen das Programm grundsätzlich in einem eigenen Terminal aus. Ich kann byobu auch aus anderen Gründen wirklich empfehlen. Nachfolgend finden Sie eine Liste von Boybu-Verknüpfungen, die für Ihre ersten Schritte nützlich sein könnten:
Nützlich:
Weniger nützlich:
Der At-Daemon und andere
at
ist ein nützliches kleines Tool, um einen Befehl zu einem festgelegten Zeitpunkt auszuführen. Es kann "missbraucht" werden, um einen Befehl von der Shell zu trennen:Auch Sie können in
setsid
und schauenstart-stop-daemon
, aber die anderen Methoden sollten ausreichen.quelle
bg %1
nur eingebenbg
.Es tut und ist oft das, was Sie wollen. Wenn Sie & vergessen haben, können Sie das Programm mit Strg-Z anhalten und es dann mit dem Befehl bg in den Hintergrund stellen - und diese Shell weiterhin verwenden.
Die Prozesse "stdin", "stdout" und "stderr" sind weiterhin mit dem Terminal verbunden. Sie können diese von / nach / dev / null oder einer anderen Datei umleiten (z. B. ein Ausgabeprotokoll irgendwo speichern), wie gewünscht:
Sie können den Prozess in Jobs sehen, ihn wieder in den Vordergrund bringen (Befehl fg) und ihm Signale senden (Befehl kill).
Einige Grafikprogramme lösen sich vom Terminal. In diesem Fall wird beim Ausführen des Befehls "normal" das grafische Programm gestartet und "beendet".
Hier ist ein kurzes Skript , das Sie in ~ / bin platzieren können , das ich runbg nannte:
Ich schaue das Programm ($ prog) nach, bevor ich es umleite, damit Fehler beim Auffinden gemeldet werden können. Führen Sie es als "runbg your-command args ..." aus. Sie können stdout / err weiterhin in eine Datei umleiten, wenn Sie die Ausgabe irgendwo speichern müssen.
Mit Ausnahme der Weiterleitungen und der Fehlerbehandlung entspricht dies der Antwort von htorque .
quelle
ctrl-z
(suspend) mir wieder Zugriff auf die Befehlszeile gibt, aber die GUI ausblendet, bis ich ein Problem erreiche,bg
das die Suspendierung zu lösen scheint. (macht Sinn) ... Gibt es einen anderen Befehl, mit dem ich die GUI trennen kann ... Aha! Ich verstehe jetzt, was du mitsighals (kill command)
... meinst (interessante Dinge, diese Signale). Ich habe ein Code-Snippet verwendet, um esdd
progressiv auszugeben. Und es hatkill
+ ein SIGNAL verwendet "?disown
Jobs -p gedit`` zu entfernen, und es schien, als würde der Job entfernt werden ... (aber ich habe Systemmeldungen im Terminal erhalten, als ich gedit manuell geschlossen habe ... aber ich denke Ich habe im Moment ein vermasseltes Terminal ... zu viel experimentiert :(jobs -p command
wenn mehrere Instanzen eines Befehls gleichzeitig im Hintergrund ausgeführt werden. Mit könnenjobs
Sie die richtige Job-ID finden und anschließendjobs -p <job-id>
die PID des Jobs ermitteln. Persönlich finde ich die Version mit der Subshell viel einfacher. ;-)gedit & disown
Um eine Anwendung zu starten und vom gestarteten Terminal zu trennen, verwenden Sie & !.
quelle
disown <pid-of-command>
nachdem Sie den Befehl im Hintergrund gestartet haben .Verwenden
nohup
Zum Beispiel:
quelle
nohup
? Bitte erläutern Sie.nohup
sollte in diesem Szenario zurückgegriffen werden.nohup
Anwendung (und die integriertedisown
Bash) lassen nicht zu, dass das Signal die Anwendung erreicht.nohup
Erstellung einer Datei im aktuellen Verzeichnis namensnohup.out
. Weitere Informationen finden Sie auf der Manpage . Ich bevorzugedisown
aus diesem Grund und für die Tatsache, dassdisown
nach dem Start funktioniertgedit
.Ö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 weiterhin in der GNU Screen- Sitzung ausgeführt werden.
quelle
Das hat bei mir funktioniert:
quelle
xdg-open
Schauen Sie sich dieses universelle Dienstprogramm an: https://linux.die.net/man/1/xdg-open
Dadurch wird ein relativer Speicherort in Ihrem Dateimanager geöffnet.
Dadurch wird eine PDF-Datei in einem PDF-Reader geöffnet.
Sie können sogar Web-URLs bereitstellen
quelle
Wie viele Leute dachten, ist Nohup die Sache, die man bedenken sollte. Aber nohup stills bleibt auf dem Terminal offen und zeigt die Programmaktivität auf dem Terminal an, was irritierend ist. Sie können das Terminal danach einfach schließen, um dies zu vermeiden. Ich habe eine sehr einfache Problemumgehung gefunden, die ich verwende.
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.
quelle
Dies funktioniert sogar innerhalb eines Skripts (Wie bei Aliases ist der & -Anhänger in Skripts normalerweise nicht zulässig, da sie nicht interaktiv sind):
quelle
Das hat bei mir funktioniert:
quelle