So kürzen Sie die Datei, die zum Umleiten von stdout verwendet wird

951
John

Ich versuche, eine Datei abzuschneiden, die für umgeleitete stdout-Dateien verwendet wird. Zum Beispiel:

ping localhost>/tmp/test.log 

Wenn ich anrufe, rm /tmp/test.logwird die Umleitung angehalten, aber der Befehl funktioniert.

Wenn ich truncate -s0 /tmp/test.logoder >/tmp/test.logoder echo ..und usw. anrufe, funktioniert die Umleitung, aber die Datei enthält führende Nullen, da sich die Position des Streams nicht geändert hat.

Wie kann ich die Datei abschneiden?

4
Beachten Sie, dass `rm / tmp / test.log` den Dateieintrag aus dem Verzeichnis entfernt. Die Datei selbst ist jedoch noch vorhanden, nimmt Platz in Anspruch und wächst im inode-basierten Dateisystem. Es wird wirklich gelöscht, wenn es nicht mehr verwendet wird, dh wenn Ihr "Ping" beendet ist oder später. Kamil Maciorowski vor 7 Jahren 1
Machen Sie einfach das Abschneiden zum Teil Ihrer Prozedur. Senden Sie 10.000 Pings oder was auch immer, löschen Sie die Datei und schreiben Sie eine neue. Seth vor 7 Jahren 0
Was meinst du; was möchtest du machen Möchten Sie Ihren `localhost` wiederholt" ping "und" / tmp / test.log "so aktualisieren, dass es nur die Ausgabestatistiken der letzten ICMP-Antwort enthält? tjt263 vor 7 Jahren 0

2 Antworten auf die Frage

2
hymie

Sie müssen die Unix-Dateisysteme verstehen, bevor Sie diese Frage beantworten können.

Das einzige, was rmtut, ist die Dateien löschen Namen, effektiv einen Zeiger aus der Verzeichnisstruktur auf die Plattenblocks.

Wenn du rennst

ping localhost > /tmp/test.log rm /tmp/test.log 

Umleitung hört nicht auf. Der Befehl läuft weiter, und Daten sammeln sich in Ihrem Festplattenbereich an. Sie haben einfach kein Recht, auf diese Daten zuzugreifen, da Sie ihren Namen gelöscht haben.

Sie können eine weitere, völlig unabhängige Datei mit dem Namen erstellen /tmp/test.log.

Wenn Sie versuchen, die Datei abzuschneiden, werden Sie die zuvor vorhandenen Daten los. Der interne Dateideskriptor kennt jedoch die Position in der Datei, auf die er verweist, und schreibt nach dem Ende der Datei die Datei. Daher die führenden Nullen.

Wenn Sie die Umleitung "zurücksetzen" möchten, müssen Sie das pingProgramm beenden, die /tmp/test.logDatei löschen oder abschneiden und das pingProgramm neu starten .

Sie könnten auch ein Programm wie rotatelogs

ping localhost | rotatelogs ping.out.%Y%m%d.%H%M 600 

um die Protokolldatei entweder basierend auf der abgelaufenen Zeit oder der Größe der Datei zu drehen.

"Sie haben einfach kein Recht, auf diese Daten zuzugreifen, da Sie den Dateisystemzeiger gelöscht haben." Im Allgemeinen trifft dies nicht zu. Der Trick ist die Verwendung von `/ proc // fd / 0` Pfad. Kamil Maciorowski vor 7 Jahren 0
0
Kamil Maciorowski

Vorausplanen:

  1. Kürzen oder löschen Sie die Datei, falls vorhanden.
  2. Verwenden Sie >>statt >.

Auf diese Weise können Sie die Tatsache ausnutzen, dass >>im Wesentlichen "immer bis zum Ende der Datei suchen" und >dabei einen Zeiger auf den zuletzt geschriebenen Ort beibehalten.

Dann können Sie die Datei abschneiden und >>gehorchen. Sehen Sie diese Antwort von mir, sie untersucht das genaue Verhalten, das Sie benötigen.