Warum kann ich die Ausgabe von Hintergrundprozessen sehen?

31

Wenn ich zum Beispiel tippe ping 8.8.8.8 &, warum sehen wir, wie der Ping-Prozess funktioniert? Und wenn ich tippe find / -name '*test*' &, wird es auch auf dem Monitor angezeigt.

Warum das? Ist es nicht wirklich im Hintergrund?

NoFence
quelle

Antworten:

43

Das &weist die Shell an, den Befehl im Hintergrund auszuführen, dh, er wird gegabelt und asynchron in einer separaten Sub-Shell als Job ausgeführt.

Beachten Sie, dass beim Einfügen &der Ausgabe - sowohl stdout als auch stderr - weiterhin auf dem Bildschirm gedruckt wird . Wenn Sie keine Ausgabe auf dem Bildschirm sehen möchten, leiten Sie beide stdoutund stderrin eine Datei um, indem Sie:

myscript > ~/myscript.log 2>&1 &

In der Regel möchten Sie die Datei möglicherweise verwerfen, stderrindem Sie sie an weiterleiten, /dev/nullwenn Sie sich später keine Gedanken über die Fehleranalyse machen.

Sie können auch Befehle / Skripte gleichzeitig in separaten Unterschalen ausführen. Zum Beispiel;

./script1 & ./script2 & ./script3 & 

Ein Hintergrundjob kann zur Befehlszeile zurückgebracht werden, bevor er mit dem Befehl beendet wird:

fg <job-number>

Die job-numberkann durch Laufen erhalten werden

jobs
Ron
quelle
Gute Antwort. Sie können auch angeben /dev/null, dass eine Datei die Terminalausgabe umleiten soll, wenn die Ausgabe verworfen werden soll, anstatt sie irgendwo zu speichern. Und bin ich richtig , dass 2>&1Umleitungen stderrzu stdout? Vielleicht möchten Sie das auch klären ... Danke.
Byte Commander
@ByteCommander Danke :) bearbeitet, hoffe es ist jetzt klar. Ja, Sie haben Recht, 2>&1leitet weiter stderrzu stdout.
Ron
3
Ich denke, es wäre erwähnenswert, stty tostopdass Hintergrundjobs angehalten werden, wenn sie versuchen, an das Terminal zu schreiben.
Kasperd
cmd_with_params> / dev / null 2> / dev / null &
tgkprog
Der einzige Nachteil dabei ist, dass die Reihenfolge der Ausgaben in stdout und stderr in der Protokolldatei verwechselt werden kann.
Matthieu
8

Wenn Sie verwenden &, läuft der Prozess im Hintergrund. Die Standardausgabe ist aber immer noch das Terminal.

Tatsächlich können Sie ping 8.8.8.8 &und find / -name '*test*' &zur gleichen Zeit ausführen (was zu einer gemischten Ausgabe führt), jedoch möglicherweise nicht ping 8.8.8.8und find / -name '*test*'zur gleichen Zeit auf derselben Shell.

Wenn Sie nichts sehen möchten, verwenden Sie etwas wie ping 8.8.8.8 &> /dev/null &.


Darüber hinaus möchten Sie vielleicht mehr über nohupund erfahren disown.

Andrea Corbellini
quelle
disownverhindert nicht, dass die Ausgabe auf das Terminal gedruckt wird.
Ruslan
@ Ruslan: nein, aber es entfernt den Job von der Shell. Was für das OP von Interesse sein kann (oder auch nicht).
Andrea Corbellini