Gibt es eine Möglichkeit, eine Datei zu löschen / abzuschneiden, während ein Prozess darauf schreibt?

8

Wir haben einen Apache-Server, der unter Linux läuft und in eine Protokolldatei schreibt, die sehr groß wird (access_log). Unser Server wird nicht mehr genügend Speicherplatz haben. Gibt es eine Möglichkeit, die Datei zu löschen oder abzuschneiden, ohne den Server neu zu starten (wir möchten keine Ausfallzeit).

Erotik
quelle

Antworten:

14

So setzen Sie Ihre Protokolldateien zurück

Früher oder später möchten Sie Ihre Protokolldateien ( access_logund error_log) zurücksetzen, weil sie zu groß oder voller alter Informationen sind, die Sie nicht benötigen.

access_log wächst normalerweise um 1 MB pro 10.000 Anforderungen.

Der erste Versuch der meisten Leute, die Protokolldatei zu ersetzen, besteht darin, nur die Protokolldatei zu verschieben oder die Protokolldatei zu entfernen. Das funktioniert nicht.

Apache schreibt weiterhin mit demselben Versatz in die Protokolldatei wie vor dem Verschieben der Protokolldatei. Dies führt dazu, dass eine neue Protokolldatei erstellt wird, die genauso groß ist wie die alte, aber jetzt Tausende (oder Millionen) Nullzeichen enthält.

Das richtige Verfahren besteht darin, die Protokolldatei zu verschieben und Apache zu signalisieren, dass die Protokolldateien erneut geöffnet werden sollen.

Apache wird mit dem Signal SIGHUP (-1) signalisiert. z.B

mv access_log access_log.old
töte -1 `cat httpd.pid` 

Hinweis: httpd.pidIst eine Datei, die die Prozess-ID des Apache httpd-Daemons enthält. Apache speichert diese im selben Verzeichnis wie die Protokolldateien.

Viele Benutzer verwenden diese Methode, um ihre Protokolldateien jede Nacht oder wöchentlich zu ersetzen (und zu sichern).

http://httpd.apache.org/docs/1.3/misc/howto.html#logreset


quelle
3
Was ist mit logrotated?
LiraNuna
Ich kann die Datei httpd.pid in / var / log / httpd nicht finden. Irgendwelche Ideen?
Erotsppa
Nicht sicher .. Haben Sie eine Verzeichnissuche durchgeführt?
Ich sehe diese Methode "mv & seufzen" in vielen Backup-Skripten. Manchmal gibt es zwei äußere Befehle: einen vor "Stop Daemon xxx" ... und einen nach "Start Daemon xxx". Sind diese Befehle nützlich oder nutzlos?
Massimo
7

Die Protokollrotation ist die langfristige Lösung, aber die Antwort auf Ihre unmittelbare Frage besteht darin, die Datei wie folgt abzuschneiden:

sudo cat /dev/null > /var/log/httpd/access_log

Ich gehe davon aus, dass Sie nicht als root angemeldet sind und den Speicherort Ihrer Protokolldatei annehmen, aber Sie sollten in der Lage sein, den Befehl nach Bedarf anzupassen und eine geöffnete Protokolldatei schnell abzuschneiden, ohne Ihre laufenden Apache-Prozesse zu berühren.

jnichols959
quelle
4
Zumindest auf meinem Ubuntu 12.04 funktioniert das nicht: Das sudogilt für cat, aber NICHT für die Dateiumleitung. Ich habe es früher getan sudo truncate -s0 logfile.
Drevicko
um Katzenmissbrauch zu vermeiden: echo > /var/log/httpd/access_log
code_monk
1
Das Abschneiden funktioniert garantiert nicht. Dies funktioniert möglicherweise, wenn die Datei im Anhänge-Modus geöffnet ist. Wenn sich die Datei beim nächsten Schreiben in die Datei nicht im Anhänge-Modus befindet, werden Daten mit dem aktuellen Versatz geschrieben, der wahrscheinlich der Länge der Datei vor dem Abschneiden entspricht. Es ist also wahrscheinlich, dass Sie eine Datei mit derselben Größe erhalten, aber alle bereits vorhandenen Daten durch 0Bytes mit einem Wert ersetzt werden (und wenn die Datei groß ist, kann dies einige Zeit dauern ...). Wenn Sie Glück haben, unterstützt das zugrunde liegende Dateisystem spärliche Dateien und die 0Bytes belegen keinen tatsächlichen Speicherplatz.
Andrew Henle
7

Null die Protokolldatei ...

# :>filename
ewwhite
quelle
Erfordert Ihr Benutzer nicht Schreibzugriff auf die Protokolldatei? Im Allgemeinen ist das nicht der Fall ...
Drevicko
1
Aufgrund der Eingabeaufforderung würde ich sagen, dass er als root angemeldet ist.
Ladadadada
6

Wenn Sie eine Protokolldatei, auf die Sie keinen Schreibzugriff haben, abschneiden / auf Null setzen möchten, können Sie dies tun

sudo truncate -s0 logfile
drevicko
quelle
Das Abschneiden der Datei funktioniert nicht
c4f4t0r
@ c4f4t0r kannst du das näher erläutern?
Drevicko
Dies ist der beste Befehl
Thyag
3

Versuchen Sie es mit logrotate

  • Es ist ein leistungsstarkes Tool, das konfigurierbare Optionen zum Drehen von Protokollen bietet.
  • Es hat auch die Möglichkeit, Befehle während prerotateund auszuführenpostrotate
  • copytruncateermöglicht es Ihnen, vorhandene Dateien zu kopieren und dann abzuschneiden. Die Kopie kann bei Bedarf zur Sicherung in einen anderen Speicher wie hadoop, s3 verschoben werden
  • Darüber hinaus kann ein Cron beispielsweise /usr/sbin/logrotate --force /etc/logrotate.hourly.conf 2>&1 >> /tmp/loggerdurch Verwendung eingestellt werden/etc/cron.hourly/logrotate

Für mehr Information man logrotate

user390652
quelle
2

Sie können einfach zuerst $ cat filename >bkp_filename eine Kopie von "Dateiname" erstellen, als die Originaldatei $ >filenamezu annullieren $ gzip bkp_filename, da sie auf die Größe Null reduziert wird. Machen Sie jetzt eine Zip-Datei für bkp_Dateiname, damit sie mehr Größe bietet und Ihr Einhängepunkt jetzt grün ist

Rohtash
quelle
Wenn Ihnen der Speicherplatz ausgeht, wird die Situation durch das Erstellen einer Kopie der Protokolldatei wahrscheinlich eher verschlechtert als verbessert. Versuchen Sie außerdem, Befehle zu formatieren, indem Sie sie in die Backticks `` `einfügen. Vielen Dank!
HBruijn
0

Hatte das gleiche Problem mit einem Prozess und behebt es mit Linux namens Pipe. Folgendes habe ich getan (vorausgesetzt, /tmp/job.log ist die Protokolldatei):

  1. Stoppen Sie den Job
  2. rm /tmp/job.log
  3. hat mit mkfifo eine Named Pipe erstellt: mkfifo /tmp/job.log
  4. ran: cat /tmp/job.log | gzip> /tmp/job.log.gz
  5. Starten Sie den Job

Auf diese Weise konnte ich das Protokoll führen und die Festplattennutzung drastisch reduzieren

Sie können gzip durch jeden Befehl ersetzen, der filtert, dreht, ...

Mohsen
quelle
Wenn /tmp/job.logder Prozess dies offen hält, wird er rm /tmp/job.lognicht nur nichts tun, um den von der Datei verwendeten Speicherplatz tatsächlich freizugeben, sondern der Prozess schreibt auch weiterhin in die jetzt gelöschte Datei. Entfernt rm nur den Dateilink aus dem Verzeichnis. Die Datei selbst wird nicht gelöscht und ihr Speicherplatz freigegeben, bis der Prozess, der sie offen hält, sie tatsächlich schließt.
Andrew Henle