Detaillierte Erklärung zur Verwendung von nohup /dev/null 2>&1

Detaillierte Erklärung zur Verwendung von nohup /dev/null 2>&1

Befehl „nohup“: Wenn Sie einen Prozess ausführen und glauben, dass der Prozess nicht beendet wird, wenn Sie sich von Ihrem Konto abmelden, können Sie den Befehl „nohup“ verwenden. Dieser Befehl kann den entsprechenden Prozess weiter ausführen, nachdem Sie sich vom Konto abgemeldet/das Terminal geschlossen haben. nohup bedeutet, nicht auflegen.

Die allgemeine Form dieses Befehls lautet: nohup command &

ls xxx 1>out.txt 2>&1
nohup /mnt/Nand3/H2000G >/dev/null 2>&1 &

& 1 ist genauer gesagt Dateideskriptor 1, der sich im Allgemeinen auf STDOUT_FILENO bezieht. Diese Operation ist eigentlich ein dup2(2)-Aufruf. Sie gibt die Standardausgabe an all_result aus und kopiert die Standardausgabe dann in Dateideskriptor 2 (STDERR_FILENO). Als Ergebnis zeigen die Dateideskriptoren 1 und 2 auf denselben Dateitabelleneintrag, oder die Fehlerausgabe wird zusammengeführt. 0 steht für Tastatureingaben, 1 für Bildschirmausgaben und 2 für Fehlerausgaben. Der Standardfehler wird an die Standardausgabe umgeleitet und dann in /DEV/NULL ausgegeben. Für Laien bedeutet dies, dass alle Standardausgaben und Standardfehler in den Papierkorb geworfen werden.

Befehl >out.file 2>&1 &

command >out.file leitet die Ausgabe des Befehls in die Datei out.file um, d. h. der Ausgabeinhalt wird nicht auf dem Bildschirm gedruckt, sondern in die Datei out.file ausgegeben. 2>&1 leitet den Standardfehler an die Standardausgabe um. Die Standardausgabe wurde hier an die Datei out.file umgeleitet, d. h. der Standardfehler wird auch an die Datei out.file ausgegeben. Das letzte & bewirkt, dass der Befehl im Hintergrund ausgeführt wird.

Denken Sie darüber nach, was 2>1 bedeutet: 2 kombiniert mit > bedeutet Fehlerumleitung und 1 bedeutet, dass Fehler in eine Datei 1 und nicht in die Standardausgabe umgeleitet werden.
Ändern Sie es in 2>&1. & in Kombination mit 1 stellt die Standardausgabe dar und der Fehler wird zur Standardausgabe umgeleitet.

Sie können
Testen Sie es, indem Sie ls 2>1 ausführen. Es wird kein Fehler über das Fehlen von Datei 2 gemeldet, sondern eine leere Datei 1 ausgegeben.
ls xxx 2>1 Test, der Fehler, dass keine Datei xxx vorhanden ist, wird auf 1 ausgegeben;
ls xxx 2>&1 Test, die Datei 1 wird nicht generiert, aber der Fehler wird zur Standardausgabe ausgeführt;
ls xxx >out.txt 2>&1, tatsächlich kann es in ls xxx 1>out.txt 2>&1 geändert werden; das Umleitungssymbol > ist standardmäßig auf 1 gesetzt und sowohl Fehler als auch Ausgaben werden nach out.txt übertragen.

Warum muss am Ende 2>&1 geschrieben werden?

Befehl > Datei 2>&1

Zunächst leitet command > file die Standardausgabe in eine Datei um, und 2>&1 ist der Standardfehler, der die Standardausgabe kopiert, d. h., er wird ebenfalls in eine Datei umgeleitet. Das Endergebnis ist, dass sowohl die Standardausgabe als auch der Fehler in eine Datei umgeleitet werden.

Befehl 2>&1 >Datei 

2>&1 Standardfehler kopiert das Verhalten der Standardausgabe, aber die Standardausgabe befindet sich weiterhin im Terminal. >Datei Die Ausgabe wird in eine Datei umgeleitet, aber der Standardfehler bleibt im Terminal bestehen.

Mit strace können Sie Folgendes sehen:

1. Befehl > Datei 2>&1
Die wichtigste Systemaufrufsequenz zum Implementieren der Umleitung in diesem Befehl lautet:

öffnen(Datei) == 3 
dup2(3,1) 
dup2(1,2)

2. Befehl 2>&1 >Datei
Die wichtigste Systemaufrufsequenz zum Implementieren der Umleitung in diesem Befehl lautet:

dup2(1,2) 
öffnen(Datei) == 3 
dup2(3,1) 

Warum verwenden wir /dev/null 2>&1? Dieser Befehl bedeutet, dass die gesamte Standardausgabe und Fehlerausgabe nach /dev/null umgeleitet werden, d. h. alle generierten Informationen verworfen werden. Lassen Sie mich Ihnen den Unterschied zwischen Befehl > Datei 2>Datei und Befehl > Datei 2>&1 erklären.

Zunächst bedeutet Befehl > Datei 2 > Datei, dass die vom Befehl generierten Standardausgabeinformationen und Fehlerausgabeinformationen an die Datei gesendet werden. Auf diese Weise werden stdout und stderr direkt an die Datei gesendet und die Datei wird zweimal geöffnet, sodass sich stdout und stderr gegenseitig überschreiben. Dies entspricht der Verwendung von FD1 und FD2, um gleichzeitig die Pipe der Datei zu belegen.

Der Befehl >file 2>&1 sendet stdout direkt an die Datei, und stderr erbt die FD1-Pipe und wird dann an die Datei gesendet. Zu diesem Zeitpunkt wird die Datei nur einmal geöffnet und nur eine Pipe FD1 wird verwendet, die den Inhalt von stdout und stderr enthält.

Aus Sicht der E/A-Effizienz ist die Effizienz des ersten Befehls geringer als die des zweiten Befehls. Daher verwenden wir beim Schreiben von Shell-Skripten häufig „Befehl > Datei 2>&1“.

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.

Das könnte Sie auch interessieren:
  • So verwenden Sie & und nohup im Hintergrund von Linux
  • So zeigen Sie im Hintergrund laufende Programme in Linux an und schließen sie
  • Tiefgreifendes Verständnis der Bedeutung von 2>&1 in der Linux-Shell (das umfassendste im Internet, Sie werden es nach dem Lesen verstehen)
  • Linux nohup, um Programme im Hintergrund auszuführen und anzuzeigen (nohup und &)
  • Detaillierte Erklärung der Lösung für das Problem, dass die Nohup-Protokollausgabe unter Linux zu groß ist
  • Linux &, Verwendung von nohup und Systemctl
  • Eine kurze Analyse der Beispiele und Unterschiede bei der Verwendung von nohup und screen zum Ausführen von Hintergrundaufgaben in Linux
  • Verwendung von nohup und tail-f unter Linux
  • Lösen Sie das Problem der im Hintergrund laufenden Python-Nohup-Linux-Ausgabe
  • PHP-Daemon-Prozess plus Linux-Befehl nohup zur Implementierung der Aufgabenausführung einmal pro Sekunde

<<:  Das WeChat-Applet implementiert das Schlangenspiel

>>:  Analyse und Lösung der MySQL-Verbindung, die den Fehler „Authentifizierung fehlgeschlagen“ auslöst

Artikel empfehlen

Vant+postcss-pxtorem implementiert Browser-Anpassungsfunktion

Rem-Layout-Anpassung Die Stile in Vant verwenden ...

Konstruktions- und Nutzungsprozess des Vue3.0-Projekts

Inhaltsverzeichnis 1. Projektkonstruktion 2: Verz...

Analyse verschiedener Fehler bei Sortierregeln für MySQL-Tabellen

Der folgende Fehler wird gemeldet, wenn MySQL meh...

MySQL-Trigger: Erstellen und Verwenden von Triggern

Dieser Artikel beschreibt anhand von Beispielen d...

Was Sie über die Transaktionsisolierung von msyql wissen müssen

Was ist eine Transaktion? Eine Transaktion ist ei...

So geben Sie Parametervariablen extern im Docker an

In diesem Artikel wird hauptsächlich erläutert, w...

So installieren Sie MySQL auf CentOS und richten den Fernzugriff ein

1. Laden Sie die MySQL-Repo-Quelle herunter $ wge...

So verhindern Sie das Flashen von Vue in kleinen Projekten

Zusammenfassung HTML: Element plus V-Umhang CSS: ...

Vue implementiert ein einfaches Einkaufswagenbeispiel

In diesem Artikel wird der spezifische Code von V...

So installieren Sie Jupyter in Docker auf CentOS und öffnen Ports

Inhaltsverzeichnis Installieren Sie Jupyter Docke...

Tutorial zur Installation von MySQL 5.6 mit RPM in CentOS

Alle vorherigen Projekte wurden in der Windows-Sy...

Beispiele für die Implementierung und Verwendung von geplanten MySQL-Aufgaben

Dieser Artikel veranschaulicht anhand von Beispie...