2012-10-19 5 views
7

私は、1時間ごとにファイルを開き、それをプリントしてファイルを閉じる長い実行スクリプトを持っています。私は最近、非常にまれにしか見つかりませんでした。プリントが失敗しました。なぜなら、プリント自体の状態をテストしているのではなく、システムが実際にリブートされるまで、ファイルのエントリが見つからないからです。何がperlで印刷エラーを引き起こす可能性がありますか?

ファイルオープンエラーのトラップを行い、それが起こったときにsyslogにメッセージを書きます。開いているエラーが表示されないので、今は失敗していると思われます。私はほとんどの人がそうではないと思われる印刷失敗をトラップしていませんが、今はその印刷物を更新しようとしています。

私の質問は誰でも、ディスクストレージが十分にあり、追加モードで正常に開かれたファイルの競合がない場合に、printステートメントが失敗する原因となる状況の種類を知っていますか?

答えて

7

メモリ不足(ENOMEM)またはファイルサイズ制限(E2BIGまたはSIGXFSZ)を超えている可能性があります。あなたは昔ながらのI/Oエラー(EIO)を持つことができます。スクリプトが並行して実行される場合、またはファイルがNFS経由でアクセスされる場合、競合状態が発生する可能性があります。もちろん、値を印刷する式にエラーがある可能性があります。

私が一度見た異例の原因は、CPUヒートシンクの故障によってsprintfが誤って故障し、ファイルディスクリプタにゴミを書き込むなどの驚くべき結果を招くことです。

最後に、printはI/Oバッファにその内容を書き込むことがよくあります。これは2つのことを意味します。 (1)close()の結果もチェックする必要があります。 (2)印刷してもただちに閉じる()やフラッシュ()しないと、データはバッファリングされ、実際に書き込まれることはありません。

+0

私はちょうど見て、その時点で67 GBの空きメモリがありました。私はまた、このファイルを更新しようとしていた同じスクリプトが、毎秒Compress :: Zlib経由で圧縮ファイルを書き込み、印刷が失敗する前に30秒間停止し、印刷が発生した時点で直ちに再起動するのを見ました。だから、ファイルシステムは一時的に「利用できません」と思われますか? –

+0

ファイルシステムが一時的に「使用不可」だった場合は、ハードディスクエラーが発生している可能性が高いことを意味します。システムログを確認してください。 – OmnipotentEntity

関連する問題