In der CLI dauert es manchmal eine Weile, bis ein von mir eingegebener Befehl ausgeführt wird, und manchmal weiß ich, wann dies passieren wird. Ich bin ein bisschen verwirrt über "Hintergrund" und so in Linux.
Was ist die gebräuchlichste (oder benutzerfreundlichste) Möglichkeit, der CLI mitzuteilen, dass ich nicht warten möchte? Bitte geben Sie mir meine Aufforderung umgehend zurück. Und wenn es mir einen Fortschrittsbalken geben könnte oder nur ein fleißiger Spinner, wäre das großartig!
command-line
background-process
der Spiegel
quelle
quelle
Antworten:
Bevor Sie
&
den Befehl ausführen , können Sie ihn an die Befehlszeile anhängen , um ihn im Hintergrund auszuführen:Nach dem Starten eines Befehls können Sie drücken CtrlZ, um ihn anzuhalten und dann
bg
in den Hintergrund zu stellen:quelle
find ...
Befehl zuerst debuggen und dann im Hintergrund ausführen. In diesem Fall haben Sie die-name
Option verpasst .Dies ist der Favorit von allen, da Sie sich, abgesehen vom Versenden des Prozesses in den Hintergrund, keine Sorgen über die Textausgabe machen müssen, die Ihr Terminal verschmutzt:
Dies führt den Prozess nicht nur im Hintergrund aus, sondern generiert auch ein Protokoll (das
nohup.out
im aktuellen Verzeichnis aufgerufen wird , falls dies nicht möglich ist, in Ihrem Ausgangsverzeichnis). Wenn Sie die aktuelle Shell schließen oder abmelden, wird der Prozess nicht abgebrochen, indem verhindert wird, dass der untergeordnete Prozess Daten empfängt Das übergeordnete Element meldet sich, wenn es getötet wird (dh wenn es sich abmeldet, indem es das übergeordnete Element aufruft oder die aktuelle Shell schließt).Es gibt andere, die genannt werden,
disown
aber das ist eher eine Erweiterung anderer Antworten als eine Methode an sich:Mit diesen Befehlen können Sie die Prozessausgaben nicht einfach wiederherstellen, es sei denn, Sie verwenden eine hackische Methode, um dies zu erreichen.
quelle
nohup
in einer Job Control Shell ist albern. Moderne Shells werden nichtHUP
an Hintergrundprozesse gesendet. Das Umleiten zu einem eindeutigen Dateinamen ist ein geringer Preis.command > file.log 2>&1 & disown
ist ein bisschen länger als,nohup command &
aber ich denke, das hat @chicks vorgeschlagen.Das ist wahrscheinlich was Sie wollen
my_command > output.log 2>&1 &
Dies startet Ihren Befehl und leitet sowohl stdout als auch stderr zu einem von
output.log
Ihnen festgelegten Befehl um. Wenn Sie die Ausgabe nicht speichern möchten, können Sie sie/dev/null
anstelle einer tatsächlichen Datei verwenden.&
führt den Befehl im Hintergrund aus, so dass Sie weitere Befehle eingeben können, während er ausgeführt wird.2>&1
Leitet stderr auf stdout um, sodass alle Ausgaben abgefangen werden.Wenn Sie einen Befehl wie diesen ausführen, sollten Sie vom Kernel eine Bestätigung erhalten, die der folgenden ähnelt:
[2] 1234
Dies bedeutet, dass Ihr Prozess im Hintergrund ausgeführt wird und die ID lautet1234
, sodass Sie ihn später beenden können, wenn Sie dies wünschenkill -9 1234
quelle
2>&1
ist sehr wichtig, da der befehl fehlschlagen kann und er in einigen fällen den fehler ausgeben kann!Schau in screen oder tmux . Ein Beispiel mit
tmux
:Während die anderen Antworten mit '&' im Hintergrund funktionieren, müssen Sie stdout (und stderr!) Umleiten. Andernfalls wird die Ausgabe direkt an Ihre Shell gesendet und mit der anderen Ausgabe gemischt, die Sie möglicherweise haben.
Die Hintergrundverarbeitung schlägt auch fehl, wenn Sie einen langen Befehl ausführen und sich abmelden oder die Verbindung trennen. Das System beendet Ihren Job.
Wenn Sie weder mit screen noch mit tmux vertraut sind, können Sie sich im Grunde genommen vollständig von Ihrer Shell lösen. Anstatt Ihr Programm im Hintergrund zu erstellen, wird die gesamte Shell im Hintergrund angezeigt. Sie können später auch von einem anderen Computer aus wieder darauf zugreifen. Sie haben beide eine Menge mehr Funktionen, die Sie möglicherweise über diesen Anwendungsfall hinaus als nützlich erachten oder auch nicht.
Screen ist das alte und bewährte Programm. tmux ist viel jünger, hat aber aus der Vergangenheit des Bildschirms gelernt.
quelle
(Der Vollständigkeit halber - bereits beantwortet :) Sie stellen einen Befehl in den Hintergrund, indem Sie
&
nach dem Befehl Folgendes hinzufügen :Ich füge diese Antwort hinzu, um den anderen Teil Ihrer Frage anzusprechen:
Es gibt kein echtes Äquivalent zum Drehfeld für die Anzeige laufender Hintergrundbefehle, aber Sie können den Status der Hintergrundbefehle durch Eingabe von
jobs
oder anzeigenjobs -l
. Es zeigt Ihnen Ihre Befehle im Hintergrund und ob sie ausgeführt, über ein Signal (z. B. mit^Z
) angehalten oder gelegentlich angehalten werden, weil sie auf interaktive Eingaben von Ihnen warten.quelle
long_command with arguments &> redirection &
um dasstderr
auch umzuleitenMit können Sie ein Programm im Hintergrund ausführen
&
. Wenn Sieyum install XyZ
beispielsweise ausführen möchten, können Sie Folgendes ausführen:Die
stdout
Ausgabe von oder aus dem Programm kann umgeleitet werden, indem>
eine Datei überschrieben oder>>
an eine Datei angehängt wird. Wenn Sie sich beispielsweiseyum
in eine Datei einloggen möchtenyum.log
:Oder wenn Sie die Ausgabe zu einer vorhandenen Datei hinzufügen möchten
log
:Fehler werden gedruckt
stderr
und nichtstdout
und können auf die gleiche Weise in eine Datei umgeleitet werden, jedoch unter Verwendung von2>
:Wenn Sie sowohl
stderr
als auch umleiten möchtenstdout
, können Sie Folgendes verwenden&>
:quelle
Sie können einen Befehl im Hintergrund ausführen, indem
&
Sie einfach ein Zeichen dahinter setzen.Zum Beispiel:
wird es im Hintergrund ausführen.
Sie können stdout / stderr weiter zu den entsprechenden Dateien umleiten, damit diese nicht auf Ihrem Terminal angezeigt werden, während Sie etwas tun.
Weitere Informationen finden Sie hier: http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-3.html
quelle
Versuchen Sie, den Befehl 'screen' zu verwenden, bevor Sie Ihre lang laufende Aufgabe starten. Wenn Sie dann die Verbindung trennen, können Sie die Verbindung mit 'screen -r -d' wiederherstellen, wann immer Sie dies erneut benötigen. Ich stelle fest, dass ein Terminal über SSH oder andere Netzwerkverbindungen manchmal durch eine schlechte Verbindung zum Server unterbrochen wird. Das Ausführen innerhalb eines "Bildschirms" behebt dieses Problem.
quelle