Ersetzen Sie die Datei durch einen festen Link zu / dev / null

32

Ich führe eine Anwendung aus, die in die Datei log.txt schreibt. Die App wurde auf eine neue Version aktualisiert, sodass die unterstützten Plugins nicht mehr kompatibel sind. Es erzwingt eine enorme Menge von Fehlern in log.txt und scheint das Schreiben in eine andere Protokolldatei nicht zu unterstützen.

Wie kann ich sie in ein anderes Protokoll schreiben?

Ich habe darüber nachgedacht, log.txt durch einen festen Link zu ersetzen (Anwendung kann den Unterschied nicht erkennen, oder?) Oder einen festen Link, der auf / dev / null verweist. Welche Möglichkeiten habe ich?

MALON
quelle
Kannst du nicht einfach chmod -w log.txt?
user168715

Antworten:

30
# cp -a /dev/null log.txt

Dies kopiert Ihr Null-Gerät mit den richtigen Haupt- und Nebenentwicklungsnummern, log.txtsodass Sie eine andere haben null.

Geräte sind im Kernel nicht namentlich bekannt, sondern durch ihre Haupt- und Nebennummer. Da ich nicht weiß, welches Betriebssystem Sie haben, fand ich es bequem, nur die Nummern zu kopieren, von denen wir bereits wissen, dass sie sind. Wenn Sie es mit den falschen Haupt- und Nebenzahlen machen, hätten Sie höchstwahrscheinlich ein anderes Gerät hergestellt, vielleicht eine Festplatte oder etwas anderes, auf das Sie nicht schreiben möchten.

Joshua
quelle
4
Es ist erwähnenswert, dass dieser Befehl erfordert sudo(oder als Root-Benutzer ausgeführt wird). Bitte erläutern Sie (in Ihrer Antwort), was Sie mit "den richtigen Haupt- und Nebenentwicklungszahlen" meinen.
mklement0
3
(Ich bin nicht der OP.) Ich schätze das Update, aber ich bin immer noch verwirrt darüber, wie "Haupt- und Nebennummern" sich auf den Dateipfad beziehen /dev/null, wie er in Ihrem Befehl verwendet wird. Und ich denke, es würde zukünftigen Lesern helfen, in Ihrer Antwort zu vermerken , sudowas erforderlich ist.
mklement0
1
@wallyk: Danke, das ist in der Tat gut zu wissen. Aber mein Punkt ist: Wie kommt das in Bezug auf cp -a /dev/null log.txtmeine Kommentare ins Spiel ?
mklement0
1
@MALON: In der Tat haben Sie, und auf Ubuntu 14.04 Sie tun müssen sudodiesen Befehl auszuführen, es sei denn , Sie als Benutzer passieren zu laufen root(was in der Regel abgeraten). Mit sudo(oder läuft als root) eine feste Verbindung (diese Antwort) oder einen symbolischen Link zu erstellen (@ V.Michel Antwort) kann die richtige Lösung nach allem, wenn die Datei in einem Ort platziert werden muss , dass jedes Benutzerkonto schreiben kann, Aber der Punkt ist: Beachten Sie diese Anforderung ausdrücklich.
mklement0
1
PS: Ich weiß, dass sich die Haupt- und Nebenkommentare wahrscheinlich auf einen Kommentar zu der Frage beziehen, in der die Verwendung von empfohlen wird mknod. Beachten Sie, dass Kommentare im Allgemeinen wenig Beachtung finden, sodass jemand, der die Frage nur liest und dann Ihre Antwort möglicherweise verwirrt (wie ich auch).
mklement0
65

Sie können einen symbolischen Link zu / dev / null erstellen und müssen nicht root sein:

ln -s /dev/null log.txt
V. Michel
quelle
Dies hat auch den Vorteil ls -l log.txt, dass es sich um eine Selbstdokumentation handelt , die zeigt, dass es sich um einen Symlink zu / dev / null handelt, anstatt sich darauf zu verlassen, dass z. B. "1, 3" irgendwie von Bedeutung ist.
Monty Harder
14

Die anderen Antworten hier werden wahrscheinlich funktionieren. Insbesondere die Symlink-Lösung wird wahrscheinlich die einfachste Lösung sein. Ich biete dies hauptsächlich der Vollständigkeit halber an.

Die beteiligten mknod(oder cp -a) Lösungen werden problematisch, wenn das Dateisystem, das die Datei enthält, keine Geräte unterstützt (z. B. wurde es mit der nodevOption bereitgestellt ). Und natürlich funktionieren harte Links zwischen Dateisystemen einfach nicht.

Eine Alternative zu festen Verbindungen oder zum Erstellen neuer Geräteknoten besteht in der Verwendung von Bind-Mounts, mit denen Sie eine Datei oder ein Verzeichnis von einem Teil Ihres Dateisystembaums auf einen anderen mounten können. So können Sie beispielsweise Folgendes ausführen:

mount -o bind /dev/null /path/to/log.txt

Dies wirkt sehr ähnlich wie eine harte Verbindung, aber:

  • Es kann dateisystemübergreifend betrieben werden (da es nicht wie ein fester Link auf Dateisystem-Inodes basiert)
  • Es funktioniert auf schreibgeschützten Dateisystemen (da Sie das Dateisystem nicht ändern)

Für ein vollständiges Beispiel:

bash-4.3# ls -l /var/log/boot.log
-rw-r--r--. 1 root root 7436 Dec 19 10:00 /var/log/boot.log
bash-4.3# mount -o bind /dev/null /var/log/boot.log
bash-4.3# ls -l /var/log/boot.log
crw-rw-rw-. 1 root root 1, 3 Dec 19 09:58 /var/log/boot.log
bash-4.3# echo words words words > /var/log/boot.log
bash-4.3# ls -l /var/log/boot.log
crw-rw-rw-. 1 root root 1, 3 Dec 19 09:58 /var/log/boot.log
larsks
quelle
Dies funktioniert jedoch nur auf Systemen, die über eine Bindungsbereitstellung verfügen. (Wie modernes Linux.)
Reinierpost
Eine Protokolldatei würde sowieso nicht in ein schreibgeschütztes Dateisystem gehören.
Monty Harder
1
Sie werden überrascht sein, wie oft Sie auf einem schreibgeschützten Dateisystem in eine einzelne Datei schreiben möchten. Und es kann sehr gut auf einem nodevDateisystem sein.
Larsks
6

Dies hängt entscheidend davon ab, wie die Anwendung mit log.txt umgeht.

Wenn die Anwendung nur die vorhandene Datei öffnet und darauf schreibt, können Sie sie wie in den anderen Antworten beschrieben mit / dev / null verknüpfen, an einer anderen Stelle verknüpfen oder an einer anderen Stelle fest verknüpfen (obwohl Hardlinks nicht dateisystemübergreifend sein können, gibt es also keine " t viel Sinn in diesem) erstellen Sie eine Kopie des / dev / null-Geräteknotens dort usw.

OTOH, wenn die Anwendung die Datei log.txt löscht und neu erstellt, funktioniert nichts davon. Sie könnten das gesamte Verzeichnis irgendwo anders verknüpfen, um die Schreibvorgänge in ein anderes Dateisystem umzuleiten, aber das ist alles, und Sie müssten sich mit anderen Dingen im Verzeichnis befassen.

Ich denke, wenn Sie wirklich wollten, können Sie ein benutzerdefiniertes Overlay-Dateisystem erstellen, das die meisten Operationen durchlaufen hat, während Sie alle Versuche, eine Datei mit dem Namen log.txt zu erstellen, verwerfen.

Plugwash
quelle
chattr +i log.txtBeim ersten Mal wird die Datei von der Anwendung nicht mehr gelöscht.
Marco Marsala
3

Nun, eine unanständige Methode mit Named Pipe:

# create a named pipe
mkfifo /path/to/log.txt
# read contents from the pipe and redirect them to /dev/null
cat /path/to/log.txt > /dev/null

Sie können fast alles mit dem gelöschten Protokoll machen, z. B. filtern oder über nc senden .

user3824053
quelle
Wenn der catProzess beendet wird oder abstürzt, bleibt das Anmeldeprogramm hängen, wenn die Pipe voll ist.
Marco Marsala
-1

Erwägen Sie, die Datei zu einem tatsächlichen Nullgerät zu machen. Eine mit mknod erstellte Datei "log.txt" mit dem richtigen Dateityp und den gleichen Neben- und Hauptnummern fungiert als Null-Gerät, da dies der Fall ist.

Rackandboneman
quelle
Dies fügt nichts zu dem hinzu, was andere bereits gesagt haben.
Kusalananda