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?

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

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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.