Führen Sie einen Befehl aus, ohne dass ich warte

145

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!

der Spiegel
quelle
3
Siehe auch Wie senden Sie Befehlszeilen-Apps direkt in den Hintergrund? wenn Sie den Befehl bereits gestartet haben und ihn in den Hintergrund senden möchten.
Gilles

Antworten:

153

Bevor Sie &den Befehl ausführen , können Sie ihn an die Befehlszeile anhängen , um ihn im Hintergrund auszuführen:

long-running-command &

Nach dem Starten eines Befehls können Sie drücken CtrlZ, um ihn anzuhalten und dann bgin den Hintergrund zu stellen:

long-running-command
[Ctrl+Z]
bg
Greg Hewgill
quelle
Ich habe den Befehl "find ~ / a.java &" verwendet, bin aber nicht in den Hintergrund gegangen? Außerdem habe ich versucht, cmd + z (für Mac) .... es funktioniert nicht
Abhimanyu Aryan
1
@AbhimanyuAryan, vielleicht möchten Sie Ihren find ...Befehl zuerst debuggen und dann im Hintergrund ausführen. In diesem Fall haben Sie die -nameOption verpasst .
Alexis Wilke
113

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:

nohup command &

Dies führt den Prozess nicht nur im Hintergrund aus, sondern generiert auch ein Protokoll (das nohup.outim 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, disownaber das ist eher eine Erweiterung anderer Antworten als eine Methode an sich:

command & # our program is in background
disown # now it detached itself of the shell, you can do whatever you want

Mit diesen Befehlen können Sie die Prozessausgaben nicht einfach wiederherstellen, es sei denn, Sie verwenden eine hackische Methode, um dies zu erreichen.

Braiam
quelle
4
Sysadmin seit '95. Ich habe bis heute nichts von Verleugnung gehört, danke! Es funktioniert jedoch nicht mit jeder Shell (Checked Bash, Zsh, Tcsh. Tcsh hat nicht funktioniert).
Yoonix
Die Verwendung nohupin einer Job Control Shell ist albern. Moderne Shells werden nicht HUPan Hintergrundprozesse gesendet. Das Umleiten zu einem eindeutigen Dateinamen ist ein geringer Preis.
Küken
@chicks der Anwendungsfall ist hier, um zu verhindern, dass stderr und stdout das Terminal mit dem Plus beschmutzen, dass es automatisch eine Protokolldatei erstellt.
Braiam
1
command > file.log 2>&1 & disownist ein bisschen länger als, nohup command &aber ich denke, das hat @chicks vorgeschlagen.
Joeytwiddle
31

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.logIhnen festgelegten Befehl um. Wenn Sie die Ausgabe nicht speichern möchten, können Sie sie /dev/nullanstelle 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>&1Leitet 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 lautet 1234, sodass Sie ihn später beenden können, wenn Sie dies wünschenkill -9 1234

travnik
quelle
2
danke, 2>&1ist sehr wichtig, da der befehl fehlschlagen kann und er in einigen fällen den fehler ausgeben kann!
Ericn
1
Dieser funktionierte, als die obigen Antworten nicht dankbar waren.
Domagoj
9

Schau in screen oder tmux . Ein Beispiel mit tmux:

$ tmux new -d 'longrunningcommand'

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.

yoonix
quelle
Diese Antwort fehlt eine tatsächliche Antwort und klingt wie ein RTFM.
Lloeki
5

(Der Vollständigkeit halber - bereits beantwortet :) Sie stellen einen Befehl in den Hintergrund, indem Sie &nach dem Befehl Folgendes hinzufügen :

long_command with arguments > redirection &

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 jobsoder anzeigen jobs -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.

alexis
quelle
long_command with arguments &> redirection &um das stderrauch umzuleiten
Ice-Blaze
3

Mit können Sie ein Programm im Hintergrund ausführen &. Wenn Sie yum install XyZbeispielsweise ausführen möchten, können Sie Folgendes ausführen:

yum install XyZ &

Die stdoutAusgabe von oder aus dem Programm kann umgeleitet werden, indem >eine Datei überschrieben oder >>an eine Datei angehängt wird. Wenn Sie sich beispielsweise yumin eine Datei einloggen möchten yum.log:

yum install XyZ > yum.log &

Oder wenn Sie die Ausgabe zu einer vorhandenen Datei hinzufügen möchten log:

yum install XyZ >> log &

Fehler werden gedruckt stderrund nicht stdoutund können auf die gleiche Weise in eine Datei umgeleitet werden, jedoch unter Verwendung von 2>:

yum install XyZ 2> errors
yum install XyZ 2>> errors

Wenn Sie sowohl stderrals auch umleiten möchten stdout, können Sie Folgendes verwenden &>:

yum install XyZ &> output
yum install XyZ &>> output
Davidson Chua
quelle
2

Sie können einen Befehl im Hintergrund ausführen, indem &Sie einfach ein Zeichen dahinter setzen.

Zum Beispiel:

areallylong_command &

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

mkc
quelle
0

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.

meaje
quelle