Linux etwas anderes Verhalten Wenn wir '&' vor der Umleitung '>' und nach der Umleitung angeben

0

Ich habe jboss kürzlich im Hintergrund unter Linux gestartet und festgestellt, dass, wenn Sie den Befehl ausführen, Folgendes zutrifft:

nohup ./startjboss.sh > server.log &

Ausgabe ist:

[1] 18835
[root@cnt5-01b downloads]#

Das Terminal für den nächsten Befehl wird direkt angezeigt.

Wenn ich den Befehl jedoch wie folgt ausführe:

nohup ./startjboss.sh & > server.log

Dann ist die Ausgabe:

[1] 19223
[root@cnt5-01b downloads]# nohup: appending output to `nohup.out'

Wenn ich dann die Eingabetaste drücke, kehrt es zurück zu:

[root@cnt5-01b downloads]#

In diesem Terminal kann ich den nächsten Befehl schreiben.

Warum gibt es einen Unterschied im Verhalten (zusätzliche Eingabe erforderlich)? Dies ist eine sehr kleine Sache, nicht einmal ein Problem; aber ich will es nur wissen.

Gaurav Fotedar
quelle

Antworten:

1

Wenn Sie das & amp; platzieren, weisen Sie die Shell an, das, was davor steht, im Hintergrund auszuführen und mit einem neuen Befehl fortzufahren.

Wenn Sie es am Ende der Zeile einfügen, gibt es keinen Befehl mehr, und die Shell kehrt in den interaktiven Modus zurück.

Wenn Sie es in die Mitte platzieren, interpretiert die Shell den Rest der Zeile als neuen Befehl. Dieser Befehl leitet die Standardausgabe von nothing an server.log um. Da Sie die Ausgabe von nohup nicht umleiten, sehen Sie sie jetzt auf dem Terminal. Da die Shell ihre PS1 bereits zuvor neu gezeichnet hatte, sehen Sie diese Ausgabezeile wie einen Befehl, aber sie wird einfach von einem Hintergrundjob ausgegeben. Sie können Ihren neuen Befehl eingeben, ohne zuvor die Eingabetaste gedrückt zu haben (obwohl dies beim späteren Lesen nicht klar ist).

user2313067
quelle
0

Nun im Grunde, wenn Sie einen Befehl mit ausführen & Danach verlieren Sie einige Funktionen.

Nehmen Sie dies als Beispiel, und erstellen Sie ein Skript, das nur 2 zurückgibt.

  • Führen Sie das Skript normal aus echo $? und Sie werden die Ausgabe sehen 2.
  • Führen Sie das Skript mit & danach laufen echo $? und Sie werden die Ausgabe sehen 0.

Auch beim Laufen nohup ./startjboss.sh & > server.log, wenn Sie das überprüfen server.log Sie werden sehen, dass die Datei leer ist, weil die Ausgabe Ihres Hintergrundprozesses erfolgt 0 bei erfolgreicher Kündigung, aber weil Sie nicht echo es in server.logEs wird also eigentlich nichts geschrieben server.log.

MoonDrop legacy
quelle