Hi,
eine wild gewordene Schleife in PHP müllt mir die "/var/log/apache2/error_<meineIP>.de.log" voll.. und zwar so richtig. letzte Woche war der Server dadurch so voll das das RZ den Kasten stoppen, mir eine Speichererweiterung verkaufen und dann neustarten musste. Dannach hab ich die erste 200mb riesige log gefunden. Eben, beim arbeiten hab ich eine 300mb große log erzeugt. Klar, ich baue grade an dem Sript rum, da kommt eine Endlosschleife schon mal vor, es kann doch aber nicht sein das die Logs da so zu geballert werden das die Maschine den Heldentot stirbt. Was ausser logging ganz abschalten kann man da machen?
Grüße Rob
Hi!
Am 15. Dezember 2012 12:25 schrieb tranquillo sportfreund_robert@gmx.de:
eine wild gewordene Schleife in PHP müllt mir die "/var/log/apache2/error_<meineIP>.de.log" voll.
Normalerweise greifen PHP-Programme nicht auf andere Programmteile über den behäbigen Webserver zu, sondern gehen übers Dateisystem oder die Datenbank. Aber wenn, sollten die abgerufenen URLs wenigstens funktionierende Scripte enthalten und nicht Fehler verursachen.
Error-Logging abzuschalten, weil Fehler auftreten, ist ja wohl nicht ernst gemeint ;-)
Thomas
Hi Thomas,
Am 15.12.2012 12:30, schrieb Thomas Schmidt:
Hi!
Am 15. Dezember 2012 12:25 schrieb tranquillo sportfreund_robert@gmx.de:
eine wild gewordene Schleife in PHP müllt mir die "/var/log/apache2/error_<meineIP>.de.log" voll.
Normalerweise greifen PHP-Programme nicht auf andere Programmteile über den behäbigen Webserver zu, sondern gehen übers Dateisystem oder die Datenbank. Aber wenn, sollten die abgerufenen URLs wenigstens funktionierende Scripte enthalten und nicht Fehler verursachen.
Das log war damit voll das die php-Funktion readdir() eine "Datei" auf dem Server nicht finden konnte. Diese wurde halt auch über den webserver raus geprintet. Das php den Fehler wirft ist völlig legitim, das war ein dummer Fehler den ich in die Schleife gebaut habe, aber das den Server gleich umhaut ist nicht akzeptabel.
Grüße Robert
Am 15.12.2012 13:34, schrieb Thomas Schmidt:
while (false !== ($file = readdir($src))){ ... } )
Wenn $src eine URL ist, testest du damit die Performance des Servers. War doch ein voller Erfolg.
Es war keine URL sondern die "Datei": "/var/www/blubb//data.xml" .. die konnte die Funktion aber nicht finden (//), hat aber auch die while nicht beendet. Evtl. eine fehlerhafte Implementation von php?
Trozdem möchte ch in Zukunft gern verhindern, wenn ich mal einen Fehler mache das ich nicht beim RZ anrufen und die Kiste wiederbeleben lassen muss.
Ansonsten ist es extrem unwahrscheinlich, dass du aus Versehen mal 200MB Logfiles produzierst.
Awesome! habs schon 2mal in einer Woche geschafft. :) (300mb beim 2ten! benötigte Dauer etwa 2min)
Grüße Rob
while (false !== ($file = readdir($src))){ ... } )
Es war keine URL sondern die "Datei": "/var/www/blubb//data.xml"
Was hast du genau gemacht?
<? readdir("/var/www/blubb//data.xml"); ?>
bringt bei mir:
Warning: readdir() expects parameter 1 to be resource, string given in /blaaa/crashtest.php on line 2
Hi Thomas,
Am 15.12.2012 13:52, schrieb Thomas Schmidt:
while (false !== ($file = readdir($src))){ ... } )
Es war keine URL sondern die "Datei": "/var/www/blubb//data.xml"
Was hast du genau gemacht?
<? readdir("/var/www/blubb//data.xml"); ?>
bringt bei mir:
Warning: readdir() expects parameter 1 to be resource, string given in /blaaa/crashtest.php on line 2
Genau und mit der While von oben drum herum wirds ein zu Silvester sehr beliebter Serverkracher.
Grüße Rob
Hallo Robert,
ich gebe dir mal einen bösen Tipp, wobei ich mir gleich die Finger in Weihwasser waschen werde. Denn was du da in deiner Endlosschleife machst widerspricht jeder guten Programmierung:
while (false !== ($file = @readdir($src))){ ... }
Das sollte klappen.
Viele Grüße,
Falk
Zitat von tranquillo sportfreund_robert@gmx.de:
Hi Thomas,
Am 15.12.2012 13:52, schrieb Thomas Schmidt:
while (false !== ($file = readdir($src))){ ... } )
Es war keine URL sondern die "Datei": "/var/www/blubb//data.xml"
Was hast du genau gemacht?
<? readdir("/var/www/blubb//data.xml"); ?>
bringt bei mir:
Warning: readdir() expects parameter 1 to be resource, string given in /blaaa/crashtest.php on line 2
Genau und mit der While von oben drum herum wirds ein zu Silvester sehr beliebter Serverkracher.
Grüße Rob
Lug-dd maillist - Lug-dd@mailman.schlittermann.de https://ssl.schlittermann.de/mailman/listinfo/lug-dd
tranquillo sportfreund_robert@gmx.de (Sa 15 Dez 2012 13:48:03 CET):
Am 15.12.2012 13:34, schrieb Thomas Schmidt:
while (false !== ($file = readdir($src))){ ... } )
Wenn $src eine URL ist, testest du damit die Performance des Servers. War doch ein voller Erfolg.
Es war keine URL sondern die "Datei": "/var/www/blubb//data.xml" .. die konnte die Funktion aber nicht finden (//), hat aber auch die while nicht beendet. Evtl. eine fehlerhafte Implementation von php?
Du möchtest an readdir() keine Datei und auch kein Verzeichnis übergeben. Das genau aber sagt PHP Dir und genau das ist sicherlich auch in einer der Manuals auf PHP.net nachzulesen
$src = opendir("… directory …") or die; while (false !== ($file = readdir($src))) { … }
Würde man nur mit „!=“ testen, bräche es ab, wenn keine Ressource an readdir übergeben wird, aber dafür würde es auch die Schleife beenden, wenn eine Datei „0“ heißt.
Was man da korrekterweise tut, könnte mal jemand erklären, der sich wirklich mit PHP auskennt.
… mehr fällt mir dazu nicht ein ☺
Trozdem möchte ch in Zukunft gern verhindern, wenn ich mal einen Fehler mache das ich nicht beim RZ anrufen und die Kiste wiederbeleben lassen muss.
Ja, wie schon an anderer Stelle von anderen empfohlen - eine eigene Logpartition anlegen, das ist das mindestens, was Du tun könntest.
Best regards from Dresden/Germany Viele Grüße aus Dresden Heiko Schlittermann
Hallo Robert,
was du hier bemängelst ist kein PHP-Problem. Jedes Programm kann Logfiles zum Überlaufen bringen. Deshalb gibt es auch je ein Dev-, Stage- und Live-System. Entweder du entwickelst lokal oder du fängst solche Fehler gleich ordentlich ab.
Sonst kann ich nur Andreas zustimmen: Error-Loging ausschalten weil es Errors gibt? In welchem Programmierkurs lernt man denn das?
Gruß,
Falk
Zitat von tranquillo sportfreund_robert@gmx.de:
Hi Thomas,
Am 15.12.2012 12:30, schrieb Thomas Schmidt:
Hi!
Am 15. Dezember 2012 12:25 schrieb tranquillo sportfreund_robert@gmx.de:
eine wild gewordene Schleife in PHP müllt mir die "/var/log/apache2/error_<meineIP>.de.log" voll.
Normalerweise greifen PHP-Programme nicht auf andere Programmteile über den behäbigen Webserver zu, sondern gehen übers Dateisystem oder die Datenbank. Aber wenn, sollten die abgerufenen URLs wenigstens funktionierende Scripte enthalten und nicht Fehler verursachen.
Das log war damit voll das die php-Funktion readdir() eine "Datei" auf dem Server nicht finden konnte. Diese wurde halt auch über den webserver raus geprintet. Das php den Fehler wirft ist völlig legitim, das war ein dummer Fehler den ich in die Schleife gebaut habe, aber das den Server gleich umhaut ist nicht akzeptabel.
Grüße Robert
Lug-dd maillist - Lug-dd@mailman.schlittermann.de https://ssl.schlittermann.de/mailman/listinfo/lug-dd
Hi Falk,
Am 15.12.2012 13:35, schrieb falk.doering@fadoe.de:
Hallo Robert,
was du hier bemängelst ist kein PHP-Problem. Jedes Programm kann Logfiles zum Überlaufen bringen.
Oh.. das is ja nicht so schön.
Deshalb gibt es auch je ein Dev-, Stage- und Live-System. Entweder du entwickelst lokal oder du fängst solche Fehler gleich ordentlich ab.
Wie genau fängt man einen Fehler ab von dem man erst weiß wenn man bei RZ anrufen muss um zu klären warum selbst kein Ping mehr auf seiner (DEV-) Maschine möglich ist?
Sonst kann ich nur Andreas zustimmen: Error-Loging ausschalten weil es Errors gibt? In welchem Programmierkurs lernt man denn das?
Beide behauptungen sind Unwahr! Weder hatte ich das je vor noch hat Andreas dem wiedersprochen. Ich hab mich an die Grupppe gewendet um genau das nicht zu tun.
Gruß,
Falk
Grüße Rob
Zitat von tranquillo sportfreund_robert@gmx.de:
Hi Thomas,
Am 15.12.2012 12:30, schrieb Thomas Schmidt:
Hi!
Am 15. Dezember 2012 12:25 schrieb tranquillo sportfreund_robert@gmx.de:
eine wild gewordene Schleife in PHP müllt mir die "/var/log/apache2/error_<meineIP>.de.log" voll.
Normalerweise greifen PHP-Programme nicht auf andere Programmteile über den behäbigen Webserver zu, sondern gehen übers Dateisystem oder die Datenbank. Aber wenn, sollten die abgerufenen URLs wenigstens funktionierende Scripte enthalten und nicht Fehler verursachen.
Das log war damit voll das die php-Funktion readdir() eine "Datei" auf dem Server nicht finden konnte. Diese wurde halt auch über den webserver raus geprintet. Das php den Fehler wirft ist völlig legitim, das war ein dummer Fehler den ich in die Schleife gebaut habe, aber das den Server gleich umhaut ist nicht akzeptabel.
Grüße Robert
Lug-dd maillist - Lug-dd@mailman.schlittermann.de https://ssl.schlittermann.de/mailman/listinfo/lug-dd
Lug-dd maillist - Lug-dd@mailman.schlittermann.de https://ssl.schlittermann.de/mailman/listinfo/lug-dd
tranquillo sportfreund_robert@gmx.de wrote:
Hi,
eine wild gewordene Schleife in PHP müllt mir die "/var/log/apache2/error_<meineIP>.de.log" voll.. und zwar so richtig. letzte Woche war der Server dadurch so voll das das RZ den Kasten stoppen, mir eine Speichererweiterung verkaufen und dann neustarten musste. Dannach hab ich die erste 200mb riesige log gefunden. Eben, beim
Ähm, whot?
Die Logs sollten doch auf einer eigenen Partition liegen. Wenn die vollläuft, sieht man doch, was die Ursache ist.
Andreas
Hi Andreas,
Am 15.12.2012 12:32, schrieb Andreas Kretschmer:
tranquillo sportfreund_robert@gmx.de wrote:
Hi,
eine wild gewordene Schleife in PHP müllt mir die "/var/log/apache2/error_<meineIP>.de.log" voll.. und zwar so richtig. letzte Woche war der Server dadurch so voll das das RZ den Kasten stoppen, mir eine Speichererweiterung verkaufen und dann neustarten musste. Dannach hab ich die erste 200mb riesige log gefunden. Eben, beim
Ähm, whot?
Die Logs sollten doch auf einer eigenen Partition liegen. Wenn die vollläuft, sieht man doch, was die Ursache ist.
Ich verstehe nicht. Der Server hat nur eine Partition (zumindest sehe ich die bei meiner VM das nur so). Die Ursache ist auch klar. Eine Endlosschleife welche beim rumprobieren schonmal vorkommt ( die php-standardlösung beim Dateizugriff: while (false !== ($file = readdir($src))){ ... } ).
Ich will das es nicht passiert das ein log welches auf Grund eines Benutzerfehlers geschrieben wird den Server platt macht. Also entweder irgendwelche harte Grenzen in php oder auf Basis des darunterliegenden debian.
Grüße Rob
tranquillo sportfreund_robert@gmx.de wrote:
Die Logs sollten doch auf einer eigenen Partition liegen. Wenn die vollläuft, sieht man doch, was die Ursache ist.
Ich verstehe nicht. Der Server hat nur eine Partition (zumindest sehe ich die bei meiner VM das nur so).
Ohh okay. Man kann aber auch eine ded. Partition für /var oder /var/logs machen, und diese monitoren. Dann ist halt /var voll, und nicht Deine eigentliche Daten-Partition. Vereinfach die Fehlersuche...
Nur weil / voll ist ohne weitere Untersuchung warum einen Zukauf machen ist aber IMHO, ähm, gaga.
Die Ursache ist auch klar. Eine Endlosschleife welche beim rumprobieren schonmal vorkommt ( die php-standardlösung beim Dateizugriff: while (false !== ($file = readdir($src))){ ... } ).
Tja, shit happens...
Ich will das es nicht passiert das ein log welches auf Grund eines Benutzerfehlers geschrieben wird den Server platt macht. Also entweder irgendwelche harte Grenzen in php oder auf Basis des darunterliegenden debian.
Nun ja, Du kannst auch fork-Bomben basteln oder andere böse Dinge. Zum 'spielen' nimmt man halt keine Produktionssysteme.
Andreas
Moinsen :)
Am 16.12.2012 09:22, schrieb Andreas Kretschmer:
tranquillo sportfreund_robert@gmx.de wrote:
Die Logs sollten doch auf einer eigenen Partition liegen. Wenn die vollläuft, sieht man doch, was die Ursache ist.
Ich verstehe nicht. Der Server hat nur eine Partition (zumindest sehe ich die bei meiner VM das nur so).
Ohh okay. Man kann aber auch eine ded. Partition für /var oder /var/logs machen, und diese monitoren. Dann ist halt /var voll, und nicht Deine eigentliche Daten-Partition. Vereinfach die Fehlersuche...
Nur weil / voll ist ohne weitere Untersuchung warum einen Zukauf machen ist aber IMHO, ähm, gaga.
Ich bin nicht sicher ob ich den Satz verstanden haben, er lässt sich schwierig parsen :) Aber der Zukauf von Speicher war nötig, da die Kiste garnicht mehr hochfuhr und das RZ mir alternativ anbot bestimmte Dateien zu löschen, die ich Pfad-genau hätte angeben müssen. Aber weder war zu dem Zeitpunkt schon klar wo genau das Problem liegt noch was die "großen" Dateien auf dem System sind. Ergo war das die sinnvollste Entscheidung. Zumal das sowieso schon mehrfach auf der Agenda stand.
Ich will das es nicht passiert das ein log welches auf Grund eines Benutzerfehlers geschrieben wird den Server platt macht. Also entweder irgendwelche harte Grenzen in php oder auf Basis des darunterliegenden debian.
Nun ja, Du kannst auch fork-Bomben basteln oder andere böse Dinge. Zum 'spielen' nimmt man halt keine Produktionssysteme.
Wie ganz oben schon geschrieben, es handelt sich um mein Dev/Spiel-System. Lokale Installationen nutzen mir überhaupt nichts, da mein Lappi Windows hat, das würde mindestens erhöhten und bis doppelten Test und Programieraufwand erzeugen. Zu dem können garnicht alle Applikationen lokal repliziert werden, da sie in abhängige Gebilde eingebettet sind. Und zu guter letzt, würde erstens Windows keine 200mb logfile schreiben und zweitens der Läppi wegen einer 200mb logfile nicht abstürzen (der gewonnen Erkenntnisgewinnn wäre also geringer).
Die Idee mit der Pipe finde ich sehr genial und könnte genau das richtige sein, klingt aber für mich noch etwas kompliziert. Die Geschichte mit extra logpartition ist sicherlich möglich... aber... jetzt geht mal ganz tief in euch.. und seid mal ganz ehrlich zu euch selbst, wenn euch ein Betriebsystem angeboten würde, nennen wir es Windows BlueFlubber, Mac OS Tigerlilly oder Kim.COM OS worldwide oder what ever und ihr erfahrt um sicher darauf proggen zu können (nur ganz schnöder php/sql kram) müsst ihr eine eigene Partition anlegen weil sonst das logfile den Server innerhalb 1-2Minuten wegschiessen kann.. würdet ihr auch nur eine Minute daran verschwenden dieses Betriebsystem zur Arbeit in Betracht zu ziehen? Ich weiß, ihr fühlt euch auf den Schlips getreten weil jemand euer baby schlecht macht, aber ich sehe es aus absolut praktischer Sicht und ohne Wertung oder bösen Willen. Aber so eine Lösung kann und will ich nicht akzeptieren. :)
Naja.. lassen wir das, die Chance das das nochmal Auftritt ist ja extrem gering, als Antwort darauf hab ich aber mein DiscMonitoring gleich noch ausgeweitet und verbessert und muss halt noch aufmerksamer bei Dateizugriffen und Schleifen sein
Viele Grüße und Danke für die umfangreiche Diskussion Rob
Moin moin,
On Sun, Dec 16, 2012 at 11:42:25AM +0100, tranquillo wrote:
Am 16.12.2012 09:22, schrieb Andreas Kretschmer:
tranquillo sportfreund_robert@gmx.de wrote:
Die Logs sollten doch auf einer eigenen Partition liegen. Wenn die vollläuft, sieht man doch, was die Ursache ist.
Ich verstehe nicht. Der Server hat nur eine Partition (zumindest sehe ich die bei meiner VM das nur so).
Ohh okay. Man kann aber auch eine ded. Partition für /var oder /var/logs machen, und diese monitoren. Dann ist halt /var voll, und nicht Deine eigentliche Daten-Partition. Vereinfach die Fehlersuche...
Nur weil / voll ist ohne weitere Untersuchung warum einen Zukauf machen ist aber IMHO, ähm, gaga.
Aber der Zukauf von Speicher war nötig, da die Kiste garnicht mehr hochfuhr und das RZ mir alternativ anbot bestimmte Dateien zu löschen, die ich Pfad-genau hätte angeben müssen. Aber weder war zu dem Zeitpunkt schon klar wo genau das Problem liegt noch was die "großen" Dateien auf dem System sind. Ergo war das die sinnvollste Entscheidung. Zumal das sowieso schon mehrfach auf der Agenda stand.
Nunja, ich hätte an deiner Stelle wohl die Jungs vom RZ nach einmal "du -cshx /*/" gefragt, und dann mir die Infos geben lassen. Einfach auf gut Glück dem Kunden eine Speichererweiterung anzudrehen, nur weil ein paar Logfiles gewachsen sind ist echt ein starkes Stück.
Ich will das es nicht passiert das ein log welches auf Grund eines Benutzerfehlers geschrieben wird den Server platt macht. Also entweder irgendwelche harte Grenzen in php oder auf Basis des darunterliegenden debian.
Nun ja, Du kannst auch fork-Bomben basteln oder andere böse Dinge. Zum 'spielen' nimmt man halt keine Produktionssysteme.
Wie ganz oben schon geschrieben, es handelt sich um mein Dev/Spiel-System. Lokale Installationen nutzen mir überhaupt nichts, da mein Lappi Windows hat, das würde mindestens erhöhten und bis doppelten Test und Programieraufwand erzeugen. Zu dem können garnicht alle Applikationen lokal repliziert werden, da sie in abhängige Gebilde eingebettet sind. Und zu guter letzt, würde erstens Windows keine 200mb logfile schreiben und zweitens der Läppi wegen einer 200mb logfile
doch, würde es (wenn du Apache2 + PHP mit demselben Problem belastest)
nicht abstürzen (der gewonnen Erkenntnisgewinnn wäre also geringer).
Nun, das nicht, aber wahrscheinlich echt lahm werden.. Im Endeffekt nehmen sich da alle Systeme nichts.
Die Idee mit der Pipe finde ich sehr genial und könnte genau das richtige sein, klingt aber für mich noch etwas kompliziert.
Wenn mir mal langweilig ist implementier ich das mal ;)
Die Geschichte mit extra logpartition ist sicherlich möglich... aber... jetzt geht mal ganz tief in euch.. und seid mal ganz ehrlich zu euch selbst, wenn euch ein Betriebsystem angeboten würde, nennen wir es Windows BlueFlubber, Mac OS Tigerlilly oder Kim.COM OS worldwide oder what ever und ihr erfahrt um sicher darauf proggen zu können (nur ganz schnöder php/sql kram) müsst ihr eine eigene Partition anlegen weil sonst das logfile den Server innerhalb 1-2Minuten wegschiessen kann.. würdet ihr auch nur eine Minute daran verschwenden dieses Betriebsystem zur Arbeit in Betracht zu ziehen?
Nunja, man sollte immer das große Ganze im Blick haben - und ja, alle Logfiles gehören auf eine sperate Platte oder einen seperaten Container. Damit meine ich z.B. auch unter Windows die Event-Logs, die auch nur in einem Ringpuffer von per Default 2MB landen.
Ich weiß, ihr fühlt euch auf den Schlips getreten weil jemand euer baby schlecht macht, aber ich sehe es aus absolut praktischer Sicht und ohne Wertung oder bösen Willen. Aber so eine Lösung kann und will ich nicht akzeptieren. :)
Nunja, dann fordere sie einfach von deinem Technischen Dienstleister - den RZ-Leuten.. denn die haben dir ein System vorgesetzt, was abkackt wenn du die Logs zumüllst.. es ist weder Aufgabe von Apache noch einem Syslog-Daemon, den freien Speicher zu überwachen.. Das ist der Job für andere Tools, und wenn du z.B. zuhause ein Standard Debian mit der Standard-Partitionierung installiert bekommst du von alleine eine /var Partition, weil es einfach Sinn macht. Und wenn du da etwas anderes machen willst endet das genauso wie wenn man ein Auto in der Mitte durchsägt: es fährt noch, aber hat keine Chance die Ideal-Linie zu halten..
Gruß, Andre
On Sunday 16 December 2012 11:42:25 tranquillo wrote:
Nun ja, Du kannst auch fork-Bomben basteln oder andere böse Dinge. Zum 'spielen' nimmt man halt keine Produktionssysteme.
Wie ganz oben schon geschrieben, es handelt sich um mein Dev/Spiel-System.
Genau da liegt ein wesentliches Problem: es mag ein System sein welches als "Dev" bezeichnet wird, aber es liegt nicht in Deiner Kontroller und verursacht Kosten wenn Du Fehler machst.
Lokale Installationen nutzen mir überhaupt nichts, da mein Lappi Windows hat, das würde mindestens erhöhten und bis doppelten Test und Programieraufwand erzeugen.
VirtualBox. Ich habe auf meinen Entwicklerlaptops mehrere VMs mit verschiedenen Betriebssystemen und Versionen - das hat sich als sehr sinnvoll erwiesen.
Zu dem können garnicht alle Applikationen lokal repliziert werden, da sie in abhängige Gebilde eingebettet sind.
Mach mal einen Schritt zurück von Deinem Problem und denk' ernsthaft über Dein Entwicklungsmodell nach. Wenn Du Deine Applikation nicht auf einer von Dir kontrollierten Umgebung testen kannst (auch Amokläufe in Logs sind "Tests"), dann hast Du ein ernsthaftes Problem mit der Qualitätssicherung. Tipp: das sind Probleme die strategisch angegangen werden müssen.
Und zu guter letzt, würde erstens Windows keine 200mb logfile schreiben und zweitens der Läppi wegen einer 200mb logfile nicht abstürzen (der gewonnen Erkenntnisgewinnn wäre also geringer).
Ich kenne Gegenbeispiele für beide Aussagen. Ich habe oft genug vor Windows- Servern gesessen, die ihre Software nicht mehr starten wollten, weil das Event-Log voll war. Und ich habe auch nahezu jede Art von Hardware/Software- Kombination abgestürzt, eingefroren, oder sonstwie unbrauchbar gesehen.
Mit genug Schwung kriegt man jeden Server aus seinem stabilen Zustand geworfen... ;-)
Die Idee mit der Pipe finde ich sehr genial und könnte genau das richtige sein, klingt aber für mich noch etwas kompliziert. Die Geschichte mit extra logpartition ist sicherlich möglich... aber... jetzt geht mal ganz tief in euch.. und seid mal ganz ehrlich zu euch selbst, wenn euch ein Betriebsystem angeboten würde, nennen wir es Windows BlueFlubber, Mac OS Tigerlilly oder Kim.COM OS worldwide oder what ever und ihr erfahrt um sicher darauf proggen zu können (nur ganz schnöder php/sql kram) müsst ihr eine eigene Partition anlegen weil sonst das logfile den Server innerhalb 1-2Minuten wegschiessen kann.. würdet ihr auch nur eine Minute daran verschwenden dieses Betriebsystem zur Arbeit in Betracht zu ziehen?
Ja. Lieber als eins bei dem ich erfahre dass noch niemand eine Lösung für dieses Problem hat. Gewöhn Dich an den Gedanken dass Du bei jedem System ein paar Regeln beachten musst oder mit den Konsequenzen der Nichtbeachtung zu leben hast.
Ich weiß, ihr fühlt euch auf den Schlips getreten weil jemand euer baby schlecht macht, aber ich sehe es aus absolut praktischer Sicht und ohne Wertung oder bösen Willen. Aber so eine Lösung kann und will ich nicht akzeptieren. :)
Ich habe kein Problem damit - ist ja nicht mein Baby, sondern nur das Betriebssystem was sich in meinem Alltag als das produktivste herausgestellt hat.
Wenn Du keine Lösungen akzeptieren willst solltest Du Dir ganz dringend eine neue Beschäftigung suchen. Beim Winterdienst werden im Augenblick ganz dringend Helfer gesucht. ;-P
Naja.. lassen wir das, die Chance das das nochmal Auftritt ist ja extrem gering,
Nein. Das tritt jedesmal auf wenn Du Blödsinn in Schleifen packst. Das ist normaler Programmieralltag. Alternativ wirst Du andere "interessante" Probleme sehen.
als Antwort darauf hab ich aber mein DiscMonitoring gleich noch ausgeweitet und verbessert und muss halt noch aufmerksamer bei Dateizugriffen und Schleifen sein
Korrekt so.
Konrad
On Sat, Dec 15, 2012 at 12:25:29PM +0100, tranquillo wrote:
eine wild gewordene Schleife in PHP müllt mir die "/var/log/apache2/error_<meineIP>.de.log" voll.. und zwar so richtig. den Heldentot stirbt. Was ausser logging ganz abschalten kann man da machen?
Moin Rob,
hast du mal geschaut wie du dem Apache beibringst, dass ein PHP-Skript nur so-und-soviele Sekunden laufen darf? Dann wird egal was für eine Endlos-Schleife du produzierst das Skript getötet, und hat keine Möglichkeit dein System zuzumüllen. (http://php.net/manual/de/info.configuration.php#ini.max-execution-time)
Ansonsten kannst du ja deine Entwicklungs-Logs auf eine seperate Partition/Loop-Device packen, und darauf auch noch mir einer Quota arbeiten (sofern das von deiner Maschine unterstützt wird).
Ich denke beide Varianten in Kombination sind am idealsten. Ich hab dazu immer wenn ich entwickle ein Terminal offen, dass ein "tail -f /var/log/apache2/error-foo.com.log" macht damit mir erstens kleinere Syntax-Fehler schneller auffallen, und zudem macht sich dann eine Log-Flut schnell bemerkbar.. und dann kann ich gleich von Hand das Script mit der höchsten CPU-Zeit töten.
Gruß, Andre
Nochmal zum Verständnis.
Werden Fehler vom Webserver oder von PHP geloggt? Das Loggen von PHP-Fehlern ist doch recht unüblich.
Deine Schleife verstehe ich ebenso wenig.
1) Du greifst auf ein Verzeichnis zu, das nicht existiert. Warum prüfst du die Existenz nicht? Du wirst die Fehlermeldungen doch gesehen haben.
2) Dann wiederholst du den Zugriff in einem unglaublichen Tempo. Was soll das? Geht da nicht ein delay()?
3) Und schließlich ist das Polling und potentiell endlose Wiederholen ein schöner Ressourcen-Killer. Kann das Script nicht nach drei Fehlversuchen abbrechen, oder, besser, nur starten, wenn die benötigte Datei da ist?
Moin Thomas,
On Sat, Dec 15, 2012 at 03:14:58PM +0100, Thomas Schmidt wrote:
Werden Fehler vom Webserver oder von PHP geloggt? Das Loggen von PHP-Fehlern ist doch recht unüblich.
Nunja, PHP-Skripte haben wie alle CLI-Tools eine Standardausgabe und eine Standard-Fehlerausgabe. Die Standardausgabe wird mit der Antwort an den Client befüttert, die Fehlerausgabe bekommen alle Fehlermeldungen mit. Der Webserver ruft also das Skript auf, und verarbeitet die beiden Ausgabe-Kanäle seperat, schreibt also die Fehler in das Error-Log und die Standardausgabe an den Client der ihn kontaktiert hatte.
Deine Schleife verstehe ich ebenso wenig.
- Du greifst auf ein Verzeichnis zu, das nicht existiert. Warum
prüfst du die Existenz nicht? Du wirst die Fehlermeldungen doch gesehen haben.
Eigentlich sollte man das vorher abgeprüft haben, denn das opendir() gibt schon einen Fehlerwert (FALSE) zurück.
- Dann wiederholst du den Zugriff in einem unglaublichen Tempo. Was
soll das? Geht da nicht ein delay()?
Das wiederholen hat eigentlich nur den Sinn, dass man alle Einträge aus dem Verzeichnis erhält, denn readdir() gibt immer nur einen Eintrag zurück und am Ende ein FALSE wenn keine weiteren Einträge vorhanden sind. Ein delay() macht da keinen sinn, denn wenn man wirklich ein Verzeichnis durchgeht will man nicht absichtlich warten. Sinn macht es nur, wenn man nicht in einem Kontext wie der Web-Entwicklung arbeitet (so z.B. wenn man einen Daemon schreibt)
- Und schließlich ist das Polling und potentiell endlose Wiederholen
ein schöner Ressourcen-Killer. Kann das Script nicht nach drei Fehlversuchen abbrechen, oder, besser, nur starten, wenn die benötigte Datei da ist?
Eigentlich sollte die Nicht-Existenz vorher abgeprüft worden sein, und daher die Schleife nie aufgerufen werden.
Gruß, Andre
Hi @ all, Am 15.12.2012 16:51, schrieb Andre Klärner:
Moin Thomas, Gruß, Andre
vielen Dank für die ganzen Vorschläge und Hinweise. Allerdings glaube ich, werd ich immer noch nicht wirklich verstanden. Wenn man entwickelt, baut man zwangsläufig viel testcode und damit potentiell schonmal viel Stuss der Fehler wirft. Das ist auch gut so, man übt bzw. versucht ja herum. Das da Fehler geworfen werden ist total in Ordnung und auch gewünscht (na klar sichere ich -jetzt- die Schleife mit einem is_dir($src) ab, nachdem klar ist das es vorkommmen kann das es den Server wegknallt wenn das nicht gemacht wird), aber ich will nicht das bei der nächsten komischen Konstellation von Code das wieder das Log voll läuft und ich wieder beim RZ anrufen muss. Ich hätte also gerne eine Lösung in der Form das die Betriebsystemkomponente die die Logfiles schreibt, vor jeder Zeile die sie schreibt schaut, sind zB. noch mindestes 30mb freier Speicher? Ja! -> Ok logge das Problem ... Nein! -> Email an mich: "Junge, Du hast ganz andere Probleme als diese Logzeile: ..."
Viele Grüße Rob
On Sat, Dec 15, 2012 at 05:27:03PM +0100, tranquillo wrote:
vielen Dank für die ganzen Vorschläge und Hinweise. Allerdings glaube ich, werd ich immer noch nicht wirklich verstanden. Ich hätte also gerne eine Lösung in der Form das die Betriebsystemkomponente die die Logfiles schreibt, vor jeder Zeile die sie schreibt schaut, sind zB. noch mindestes 30mb freier Speicher? Ja! -> Ok logge das Problem ... Nein! -> Email an mich: "Junge, Du hast ganz andere Probleme als diese Logzeile: ..."
Tja, dann viel Spass beim Apache2 patchen und in Zukunft betreuen..
Besser ist du packst die Apache-Logs auf ne seperate Partition und überwach den Füllgrad dort mit OS-Mitteln, Nagios, Munin oder ähnlichem.
Warum sowas nicht im Apache implementiert ist kann ich dir auch sagen: Jeder mit etwas Verstand wird nicht auf dem gefährlichen Produktiv-System neuen völlig ungetesteten Code ausführen, weil es immer sein kann, das man sich damit etwas zerschießt, vielleicht auch nur wenn man ein neues Modul installiert. Deswegen gibt es Testlandschaften, die zwar Geld und Zeit kosten, aber einem auch riesigen Stress ersparen.
Demzufolge würde ich dir raten, dass du neuen Code idealerweise nicht auf dem Produktivsystem testest, sondern lieber lokal mit einer kleinen Apache/PHP-Installation. Und versuch immer zu überlegen: "Was sind die Möglichkeiten das etwas schiefgeht? Was passiert wenn z.B. die Datei nicht existiert? Enthält der Dateiname Komponenten die aus einer Nutzer-Eingabe kommen?" Wenn du dir solche Fragen bei jedem neuen Block stellst wird du viel weniger Fehler machen.
Gruß, Andre
Moin,
tranquillo sportfreund_robert@gmx.de (Sa 15 Dez 2012 17:27:03 CET):
Betriebsystemkomponente die die Logfiles schreibt, vor jeder Zeile die sie schreibt schaut, sind zB. noch mindestes 30mb freier Speicher? Ja! -> Ok logge das Problem ... Nein! -> Email an mich: "Junge, Du hast ganz andere Probleme als diese Logzeile: ..."
Wenn Du partout keine eigene Partition für das Logging vorsehen möchtest, kannst Du den Apachen auch in eine Pipeline loggen lassen. Diese Pipeline kann ein von Dir geschriebener Script sein, der dann genau das tut, was Du möchtest - z.B. prüfen, ob noch genug Platz ist, und dann etwas schlaues tun, wenn keiner mehr da ist.
Ich meine, das wird mit einigen wenigen Zeilen *sh oder einer fast beliebigen P-Sprache machbar sein.
Best regards from Dresden/Germany Viele Grüße aus Dresden Heiko Schlittermann
Hi @ all, Am 15.12.2012 16:51, schrieb Andre Klärner:
Moin Thomas, Gruß, Andre
vielen Dank für die ganzen Vorschläge und Hinweise. Allerdings glaube ich, werd ich immer noch nicht wirklich verstanden. Wenn man entwickelt, baut man zwangsläufig viel testcode und damit potentiell schonmal viel Stuss der Fehler wirft. Das ist auch gut so, man übt bzw. versucht ja herum. Das da Fehler geworfen werden ist total in Ordnung und auch gewünscht (na klar sichere ich -jetzt- die Schleife mit einem is_dir($src) ab, nachdem klar ist das es vorkommmen kann das es den Server wegknallt wenn das nicht gemacht wird), aber ich will nicht das bei der nächsten komischen Konstellation von Code das wieder das Log voll läuft und ich wieder beim RZ anrufen muss. Ich hätte also gerne eine Lösung in der Form das die Betriebsystemkomponente die die Logfiles schreibt, vor jeder Zeile die sie schreibt schaut, sind zB. noch mindestes 30mb freier Speicher? Ja!
Du könntest im logrotat ein filesize einstellen. wenn du ein paar logs aufheben willst, kannst du sie noch komprimieren. (Informationen können verloren gehen)
-> Ok logge das Problem ... Nein! -> Email an mich: "Junge, Du hast ganz andere Probleme als diese Logzeile: ..."
da ist doch schnell ein kleines Überwachungsscript geschrieben das schaut ob in der letzten stunde ein verzeichniss zu wächst
du kannst dir auch eine quota einrichten und dich an mailen lassen wenn es zu viel wird (könntest auch einen "Container" mit fester Größe erstellen und in als var mounten dann sollte dir dein system nicht stehen bleiben, Informationen gehen aber an mass verloren)
Andreas
Viele Grüße Rob
Lug-dd maillist - Lug-dd@mailman.schlittermann.de https://ssl.schlittermann.de/mailman/listinfo/lug-dd
Moin,
Grimnin Fridyson fridy_lugdd@yahoo.de (Sa 15 Dez 2012 23:35:09 CET):
Betriebsystemkomponente die die Logfiles schreibt, vor jeder Zeile die sie schreibt schaut, sind zB. noch mindestes 30mb freier Speicher? Ja!
Du könntest im logrotat ein filesize einstellen. wenn du ein paar logs aufheben willst, kannst du sie noch komprimieren. (Informationen können verloren gehen)
logrotate ist aber kein Daemon, der dann plötzlich aktiv wird. Sondern das mit der Filesize zieht auch nur immer dann, wenn er aufgerufen wird (typischerweise 1x täglich)
----- Ursprüngliche Message -----
Von: Heiko Schlittermann hs@schlittermann.de An: lug-dd@mailman.schlittermann.de CC: Gesendet: 22:24 Sonntag, 16.Dezember 2012 Betreff: Re: php error müllt apache2 log voll
Moin,
Grimnin Fridyson fridy_lugdd@yahoo.de (Sa 15 Dez 2012 23:35:09 CET):
Betriebsystemkomponente die die Logfiles schreibt, vor jeder Zeile die sie schreibt schaut, sind zB. noch mindestes 30mb freier Speicher? Ja!
Du könntest im logrotat ein filesize einstellen. wenn du ein paar logs
aufheben willst, kannst du sie noch komprimieren.
(Informationen können verloren gehen)
logrotate ist aber kein Daemon, der dann plötzlich aktiv wird. Sondern das mit der Filesize zieht auch nur immer dann, wenn er aufgerufen wird (typischerweise 1x täglich)
haste natürlich recht
man könnte das apache log an den rsyslog senden
http://wiki.rsyslog.com/index.php/Working_Apache_and_Rsyslog_configuration
und dann rsyslog so einrichten das es rotiert
http://www.rsyslog.com/doc/log_rotation_fix_size.html
Andreas
-- Heiko
Lug-dd maillist - Lug-dd@mailman.schlittermann.de https://ssl.schlittermann.de/mailman/listinfo/lug-dd
Hallo Ottmar,
bis vor Kurzem habe ich meinen Hauptrechner so gesichert daß ich auf
Verrätst Du uns Dein "Haupt-OS"? Ich vermute natürlich Linux - bei der Gruppe hier ;-)
Ich habe ein Backupsystem, mit lokalen und externen Platten. Dort habe ich ein md (SoftRaid) über je eine interen und externe Platte gelegt, darin dann ein truecrypt. Ich sichere somit in ein truecrypt und tausche alle 7 Tage die externe Platte, die ein Spiegel der internen ist - so habe ich immer eine Platte an anderem Ort und geht die mal verloren, war die auch verschlüsslet.
Verschlüsselung ist ja nun nicht Deine Anforderung, aber vllt kannst Du Dir das Konzept ja auch für Dein OS vorstellen. Lege ein md unter deinen OS Partitionen und mache die externe Platte gelegentlich zum Partner/Member.
So kann man weiterarbeiten, die Konsistenz der Daten entspricht aber der eines laufenden Systems, daten/Prozesse im RAM sicherst Du so _NICHT_.
Sicherlich kann hier auch wer mit LVM weiterhelfen.
weihnachtliche Grüße Ronny
Hallo Ottmar,
Klingt für mich nach einer Aufgabe für ein hardware-raid1. Die vorhandene Platte verdoppeln und 1:1 redundant nutzen. Vorher ein Image der aktuellen Platte ziehen und nach Einrichtung des raid1 im (oder kurz nach dem) mainboard bios das Image wieder einspielen, welches dann wie alle anderen daten auch automatisch redundant gespeichert werden.
Zum backupen von nur einzelnen Ordnern unter MS bietet sich das hauseigene Sync Framework an. Ähnliches gibts sicher auch unterm Pinguin.
Vg
Am 15.12.2012 17:27, schrieb tranquillo:
vielen Dank für die ganzen Vorschläge und Hinweise. Allerdings glaube ich, werd ich immer noch nicht wirklich verstanden.
Ich glaube schon, dass die Mehrheit Dein Problem verstanden hat.
Begrenzungen in logrotate/rotatelogs würde ich jedoch nicht empfehlen, da Dir dadurch möglicherweise notwendige Infos entgehen könnten.
Besser wäre in Deinem Fall, wie auch schon geschrieben wurde, saubere Programmierung - meint: Fehler bereits innerhalb des Scripts abfangen.
Und vor allem, wie Dir ebenfalls bereits empfohlen wurde, nicht auf dem Live-System testen, sondern eine identische lokale Installation einrichten oder gegebenenfalls einen gleichwertigen Test-Server mieten.
Gruß René Thiel (Rennkuckuck) mailto:reti@rennkuckuck.de
lug-dd@mailman.schlittermann.de