2012-10-19 68 views
7

我有一個長時間運行的腳本,每小時打開一個文件,打印並關閉文件。我最近很少發現打印失敗,不是因爲我測試打印本身的狀態,而是由於在系統實際重新啓動之前缺少文件中的條目這一事實!什麼可能導致perl中出現打印錯誤?

我的文件打開失敗做陷阱,寫一條消息,發生在到syslog,我沒有看到任何打開的故障,所以我現在猜測它可能是發生故障的打印。我沒有陷入印刷故障,我懷疑大多數人不這樣做,但現在要更新那一張印刷品。

同時,我的問題是沒有人知道是什麼類型的情況下可能會導致打印語句時有足夠的磁盤存儲空間,並沒有爭奪已在附加模式已經成功打開的失敗?

回答

7

你可能是內存不足(ENOMEM),或在大小限制(E2BIG或SIGXFSZ)。你可能會有一個老式的I/O錯誤(EIO)。如果腳本同時運行或通過NFS訪問文件,則可能會出現爭用條件。而且,當然,您可能會在要打印的值的表達式中出現錯誤。

異國情調的原因,我曾經看到的是,一個CPU散熱器故障會導致sprintf的虛假失敗,導致一些令人驚訝的結果,包括寫垃圾文件描述符。

最後,我提醒你,打印會經常寫東西,它在I/O緩衝區。這意味着兩件事。 (1)您還需要檢查close()的結果。 (2)如果你打印,但你沒有立即關閉()或刷新(),那麼你的數據可以被緩衝,而不是實際寫入,直到很晚(或根本沒有,如果進程死亡可怕)。

+0

很好的猜測,但我只是看着,並在當時的可用內存67GB。我也看到了試圖更新這個文件的同一個腳本,同時每秒通過Compress :: Zlib寫一個壓縮文件,並且在打印失敗之前停頓了30秒,並且在發生打印時立即重新啓動。所以看起來文件系統暫時「不可用」? –

+0

如果您的文件系統暫時「不可用」,這意味着您可能有硬盤錯誤,請檢查您的系統日誌。 – OmnipotentEntity

相關問題