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

Das WeChat-Applet implementiert den Serveraufbau des Benutzeranmeldemoduls

Ich habe node.js zum Erstellen des Servers gewähl...

Was Sie beim Schreiben selbstschließender XHTML-Tags beachten sollten

Das img-Tag in XHTML sollte wie folgt geschrieben...

Vue elementUI implementiert Baumstrukturtabelle und Lazy Loading

Inhaltsverzeichnis 1. Ergebnisse erzielen 2. Back...

Detaillierte Erläuterung des Beispiels der Caching-Methode von Vue

Kürzlich wurde die neue Anforderung „Front-End-Ca...

Detaillierte Erklärung der Bind-Mounts für die Docker-Datenspeicherung

Bevor Sie diesen Artikel lesen, hoffe ich, dass S...

So verweisen Sie im WeChat-Applet wxss auf externe CSS-Dateien und Iconfonts

Ursache So importieren Sie externe Dateien in ein...

Zusammenfassung gängiger Fehler beim Entwurf von MySQL-Tabellen

Inhaltsverzeichnis Fehler 1: Zu viele Datenspalte...

Vue macht Div-Höhe verschiebbar

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

Detailliertes Tutorial zur Installation der MySQL 8.0.20-Datenbank auf CentOS 7

Weiterführende Literatur: MySQL8.0.20-Installatio...

Die 7 besten VSCode-Erweiterungen für Vue-Entwickler

Das Hinzufügen der richtigen VS Code-Erweiterung ...

Eine einfache Methode zum Zusammenführen und Entfernen doppelter MySQL-Tabellen

Szenario: Die gecrawlten Daten erzeugen eine Date...