Diese Frage wurde mir in zwei aufeinanderfolgenden Interviews gestellt, aber nach einigen Recherchen und Gesprächen mit verschiedenen Systemadministratoren habe ich keine gute Antwort erhalten. Ich frage mich, ob mir hier jemand helfen kann.
Auf einem Server ist nicht genügend Speicherplatz vorhanden. Sie stellen fest, dass eine sehr große Protokolldatei sicher entfernt werden kann. Sie löschen die Datei, aber der Datenträger zeigt weiterhin an, dass er voll ist. Was würde dies verursachen und wie würden Sie es beheben? Und wie würden Sie herausfinden, welcher Prozess diese riesige Protokolldatei schreibt?
linux
shell
log-files
disk-space-utilization
ewwhite
quelle
quelle
Antworten:
Dies ist eine häufig gestellte Interviewfrage und eine Situation, die in einer Vielzahl von Produktionsumgebungen auftritt.
Die Verzeichniseinträge der Datei wurden gelöscht, der Protokollierungsprozess wird jedoch weiterhin ausgeführt. Der Speicherplatz wird vom Betriebssystem erst dann freigegeben, wenn alle Dateizugriffsnummern geschlossen wurden (z. B. wenn der Prozess abgebrochen wurde) und alle Verzeichniseinträge entfernt wurden. Um den Prozess zu finden, der in die Datei schreibt, müssen Sie den
lsof
Befehl verwenden.Der andere Teil der Frage kann manchmal lauten: "Wie löscht man eine Datei, in die geschrieben wird, ohne den Prozess zu beenden?" Im Idealfall würden Sie die Protokolldatei mit so etwas wie "null" oder "kürzen",
: > /var/log/logfile
anstatt die Datei zu löschen.quelle
fuser
.no-clobber
, versuchen Sie:>| /var/log/logfile
df
,du
Sie verwenden kaum welche. Was ist der Grund dafür und warum stimmen die beiden Tools nicht überein?"> /var/log/file
dem Speicherplatz auf der Festplatte immer noch 100%? Die Protokolldatei scheint leer zu sein ... aber erst nach dem Neustart des Programms, das in diese Protokolldatei schreibt, wird der Speicherplatz wiederhergestellt. Gibt es eine Möglichkeit, den Speicherplatz wiederherzustellen, ohne das Programm neu zu starten?Es gibt noch einen weiteren Link zur Datei (entweder fester Link oder offenes Dateihandle). Durch Löschen einer Datei wird nur der Verzeichniseintrag gelöscht. Die Dateidaten und der Inode hängen herum, bis der letzte Verweis darauf entfernt wurde.
Es ist eine gängige Praxis, dass ein Dienst eine temporäre Datei erstellt und diese sofort löscht, während die Datei geöffnet bleibt. Dadurch wird eine Datei auf dem Datenträger erstellt. Es wird jedoch sichergestellt, dass die Datei gelöscht wird, wenn der Prozess abnormal beendet wird, und es wird auch verhindert, dass andere Prozesse versehentlich auf die Datei zugreifen. MySQL führt dies beispielsweise für alle temporären Tabellen auf der Festplatte durch. Malware verwendet häufig ähnliche Methoden, um ihre Dateien zu verbergen.
Unter Linux können Sie bequem auf diese gelöschten Dateien zugreifen als
/proc/<pid>/fd/<filenumber>
.quelle
Ich bin kein Systemadministrator, aber nach dem, was ich unter Unix.SE zusammengetragen habe, löscht ein Linux-System eine Datei nicht (markieren Sie den Speicherplatz als frei / wiederverwendbar), nachdem die Verknüpfung aufgehoben wurde, bis alle darauf verweisenden Dateideskriptoren dies getan haben wurde geschlossen. Um den ersten Teil zu beantworten, ist der Speicherplatz noch nicht frei, da er noch von einem Prozess gelesen wird. Zur Beantwortung der zweiten Frage können Sie sehen, bei welchem Prozess die Datei verwendet wird
lsof
.quelle
Eine alternative Antwort neben der offensichtlichen Antwort auf Hardlink / Open File: Diese Datei ist eine (sehr) spärliche Datei wie
/var/log/lastlog
auf RHEL, die eigentlich nicht so viel Platz in Anspruch nimmt. Das Löschen hatte nur geringe Auswirkungen. Sie müssen sich daher die nächstgrößere Datei ansehen.quelle
Wenn der Prozess, bei dem die Datei geschrieben wird, root ist, wird in den für den Superuser reservierten Dateibereich geschrieben. Das Dateisystem verfügt über diesen Speicherplatz, um ein System betriebsbereit zu halten, falls eine Benutzeraufgabe den Datenträger füllt. Dieser Bereich (imho per default 5%) ist für viele Tools unsichtbar.
lsof kann Ihnen zeigen, welcher Prozess die Datei gesperrt hat, ergo schreibt darauf.
quelle
Ein zweiter Fall ist, dass die Datei nicht nur von einem Prozess geöffnet wird, sondern auch von einem Dateisystem, das Snapshots wie
btrfs
oder unterstütztZFS
.Zum Beispiel machen Sie einen Schnappschuss mit der riesigen vorhandenen Protokolldatei. Wenn Sie die Datei jetzt löschen, wird nur das Delta gelöscht. Das Delta wird nur gelöscht, wenn die Datei nicht verwendet wird.
Siehe auch:
https://superuser.com/questions/863588/how-to-delete-a-file-in-all-snapshots-on-a-btrfs-system
ZFS: Dateien aus Snapshots entfernen?
Ein dritter Fall liegt vor, wenn Sie ein Dateisystem haben, das die Deduplizierung auf Blockebene unterstützt und der größte Teil der Datei mit einer anderen Datei identisch ist. Ich erwarte nicht, dass dies für ein Protokoll geschieht, es sei denn, Sie haben einen Container oder eine VM, die die Protokolle an einen Syslog-Container oder eine VM sendet, die denselben FS verwenden, sodass die Protokollinhalte identisch sind.
quelle