2012-10-19 26 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

相关问题