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?
quelle
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?
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 stdout
und stderr
in eine Datei um, indem Sie:
myscript > ~/myscript.log 2>&1 &
In der Regel möchten Sie die Datei möglicherweise verwerfen, stderr
indem Sie sie an weiterleiten, /dev/null
wenn 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-number
kann durch Laufen erhalten werden
jobs
/dev/null
, dass eine Datei die Terminalausgabe umleiten soll, wenn die Ausgabe verworfen werden soll, anstatt sie irgendwo zu speichern. Und bin ich richtig , dass2>&1
Umleitungenstderr
zustdout
? Vielleicht möchten Sie das auch klären ... Danke.2>&1
leitet weiterstderr
zustdout
.stty tostop
dass Hintergrundjobs angehalten werden, wenn sie versuchen, an das Terminal zu schreiben.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 &
undfind / -name '*test*' &
zur gleichen Zeit ausführen (was zu einer gemischten Ausgabe führt), jedoch möglicherweise nichtping 8.8.8.8
undfind / -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
nohup
und erfahrendisown
.quelle
disown
verhindert nicht, dass die Ausgabe auf das Terminal gedruckt wird.