【问题标题】:Externally Modifying a File Breaks Writable Streams in node.js外部修改文件会破坏 node.js 中的可写流
【发布时间】:2014-09-15 04:44:40
【问题描述】:

我有一个简单的日志工具可以将日志数据写入磁盘,它的工作原理如下:

  1. 使用fs.createWriteStream 创建一个可写流,并使用标志“a”进行附加。这会创建或打开文件供我写入数据。
  2. 使用writeStream.write() 将数据写入我的日志文件。

这非常有效,除了以下两种情况:

  1. 我在应用程序运行时打开日志文件,更改一些内容,然后保存日志文件。
  2. 我在应用程序运行时删除了日志文件。预期行为是重新创建文件并继续记录。

在这两种情况下,我仍然可以毫无错误地调用writeStream.write()

在应用程序运行时修改或删除日志文件后检查我的writeStream 对象显示writeStream.writable 属性为true。每次我调用 writeStream.write() 时,writelen 属性都会增加,这让我相信 writeStream 认为一切都很好,即使不是。

我的问题:

  1. 为什么在外部修改和保存我的日志文件会导致writeStream.write() 停止向我的文件写入数据?我该如何解决?
  2. 为什么从外部删除我的日志文件会导致writeStream.write() 停止向我的文件写入数据?我该如何解决?

【问题讨论】:

    标签: javascript node.js file stream


    【解决方案1】:

    一切都好的,就写入流而言。当您删除文件时,您实际上是在删除目录中的一个条目,但原始 inode 没有被删除,并且您打开它的应用程序一直在写入磁盘,只是您没有指向它的指针(目录条目),所以看不到。您会注意到可用磁盘空间不断减少,这告诉您事情确实已写入。当应用程序关闭文件时,它然后被删除(因为没有留下指向它的引用),此时可用磁盘空间将再次增加。

    您尝试做的标准做法是发送信号(SIGHUPSIGUSR1 到应用程序),并在信号处理程序中关闭应用程序并重新打开文件。这称为“日志轮换”。有很多节点包可以为你做这个,或者你可以自己做这个练习:-)

    【讨论】:

    • 感谢您的提醒!您能否为我指明正确的方向以获取有关如何发送信号的说明?
    • 取决于您从哪里发送信号。如果是命令行或 shell 脚本,则为 kill -SIGHUP pid。 node、Python、Ruby等都有等价的库函数
    猜你喜欢
    • 1970-01-01
    • 2018-06-27
    • 1970-01-01
    • 2018-01-28
    • 2011-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多