2012-10-19 15 views
7

Ich habe ein lang laufendes Skript, das jede Stunde eine Datei öffnet, druckt und schließt die Datei. Ich habe kürzlich sehr selten festgestellt, dass der Druck fehlschlägt, nicht weil ich den Status des Drucks selbst teste, sondern aufgrund fehlender Einträge in der Datei, bis das System tatsächlich neu gestartet wird!was könnte einen Druckfehler in Perl verursachen?

Ich Trap für Datei öffnen Fehler und schreibe eine Nachricht an Syslog, wenn dies passiert, und ich sehe keine offenen Fehler, so dass ich jetzt vermute, es könnte der Druck, der fehlschlägt. Ich halte die Druckfehler nicht fest, was meiner Meinung nach die meisten Leute nicht tun, aber ich werde jetzt diesen einen Druck aktualisieren.

In der Zwischenzeit ist meine Frage, weiß jemand, welche Arten von Situationen könnte eine Druckanweisung fehlschlagen, wenn es viel Speicherplatz und keine Konkurrenz für eine Datei, die im Append-Modus erfolgreich geöffnet wurde?

Antwort

7

Sie könnten nicht genügend Arbeitsspeicher (ENOMEM) oder ein Dateigrößenlimit (E2BIG oder SIGXFSZ) haben. Sie könnten einen altmodischen E/A-Fehler (EIO) haben. Sie könnten eine Racebedingung haben, wenn das Skript gleichzeitig ausgeführt wird oder wenn auf die Datei über NFS zugegriffen wird. Und natürlich könnten Sie einen Fehler in dem Ausdruck haben, dessen Wert Sie drucken würden. Ein exotischer Grund, den ich einmal gesehen habe, ist, dass ein CPU-Kühlkörperfehler dazu führen kann, dass sprintf fälschlicherweise ausfällt, was zu einigen überraschenden Ergebnissen führt, einschließlich dem Schreiben von Müll in Dateideskriptoren.

Schließlich erinnere ich Sie, dass Druck wird oft seine Sachen in einem I/O-Puffer schreiben. Das bedeutet zwei Dinge. (1) Sie müssen auch das Ergebnis von close() überprüfen. (2) Wenn Sie drucken, aber Sie nicht sofort schließen() oder flush(), können Ihre Daten gepuffert und nicht viel später geschrieben werden (oder gar nicht, wenn der Prozess schrecklich stirbt).

+0

gute Vermutung, aber ich sah nur und hatte 67 GB freien Speicher zu der Zeit. Ich sah auch das gleiche Skript, das versuchte, diese Datei zu aktualisieren, schreibt gleichzeitig eine komprimierte Datei über Compress :: Zlib jede Sekunde und es blieb für 30 Sekunden stehen, bevor der Druck fehlschlug und sofort um den Zeitpunkt des Drucks neu gestartet wurde. So scheint es, das Dateisystem war vorübergehend "nicht verfügbar"? –

+0

Wenn Ihr Dateisystem vorübergehend nicht verfügbar war, was bedeutet, dass Sie wahrscheinlich einen Festplattenfehler haben, überprüfen Sie Ihr Systemprotokoll. – OmnipotentEntity

Verwandte Themen