Re: /kernel: handle_workitem_freeblocks

From: Bernd Walter <ticso(at)cicely5.cicely.de>
Date: Tue, 21 May 2002 22:30:28 +0200

On Tue, May 21, 2002 at 08:05:15PM +0200, Oliver Fromme wrote:
> Stefan Weißwange <sweisswange(at)gmx.de> wrote:
> > Oliver Fromme schrieb:
> > > > $ echo "" > ipmon.log
> > >
> > > Warum genau tust Du das? Daß man so keine Logfiles kürzen
> > > kann, ist Dir klar, oder ...?
> >
> > Jetzt schon ;-) Ich hab's halt so gemacht, weils auch nie damit Probleme
> > gab, aber wenn das so nicht geht, wie gehts dann "richtig"? Wie gesagt,
> > ich bin relativ neu im FreeBSD und dachte mir, wenn ich die Datei so
> > leere, dürfte es keine Probleme geben.
>
> Das ist jetzt nicht FreeBSD-spezifisch, sondern ist bei
> UNIX generell so.
>
> Wenn ein Prozeß eine Datei geöffnet hält (z.B. eine Log-
> Datei), dann ist es ihm relativ egal, was andere Prozesse
> mit dieser Datei anstellen. Wenn er einen open()-syscall
> macht, erhält er einen Filehandle für die Datei, der ver-
> schiedene Eigenschaften für den Zugriff auf diese Datei
> enthält, z.B. den inode die Position im Filesystem und den
> Filepointer (d.h. bei welchem Offset in der Datei der näch-
> ste Schreibzugriff passiert).
>
> Wenn Du jetzt ein »echo "" > Logdatei« machst, dann macht
> die Shell zuerst ein truncate() auf die Datei, um sie auf
> 0 Bytes zu kürzen, dann erzeugt das »echo ""« ein Newline,
> das an den Anfang der Datei geschrieben wird. Theoretisch
> müßte die Datei jetzt ein Byte groß sein (eine Leerzeile).
>
> Das alles kümmert aber unseren Prozeß nicht, der die Datei
> immer noch geöffnet hält. Weder das truncate() noch der
> Schreibzugriff durch das echo haben an seinem Handle etwas
> geändert (logisch), und sein Filepointer zeigt immer noch
> an die alte Position. Wenn jetzt dieser Prozeß eine wei-
> tere Zeile in das Logfile schreibt, landet diese nicht
> etwa an Byte 1 (hinter dem Newline), sondern natürlich
> dort, wo sein Filepointer (immer noch) hinzeigt, irgendwo
> weiter hinten. Zwischen Byte 1 und dieser Schreibposition
> entsteht eine Lücke.

Dann ist das Programm kaput - IMHO.
Ein Logfile sollte schon mit O_APPEND geöffnet werden.
Unter der Voraussetzung, daß es wirklich ein Logfile war.
Mit syslogd klappt es wunderbar - mal abgesehen, daß man ein
»cp /dev/null /var/log/irgendwas« macht und man den Daemon denoch
besser die Datei neu öffnen lässt.

-- 
B.Walter              COSMO-Project         http://www.cosmo-project.de
ticso(at)cicely.de         Usergroup           info(at)cosmo-project.de
To Unsubscribe: send mail to majordomo(at)de.FreeBSD.org
with "unsubscribe de-bsd-questions" in the body of the message
Received on Tue 21 May 2002 - 22:31:14 CEST

search this site