Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/434.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从外部修改文件会中断node.js中的可写流_Javascript_Node.js_File_Stream - Fatal编程技术网

Javascript 从外部修改文件会中断node.js中的可写流

Javascript 从外部修改文件会中断node.js中的可写流,javascript,node.js,file,stream,Javascript,Node.js,File,Stream,我有一个简单的日志记录工具将日志数据写入磁盘,它的工作原理如下: 使用fs.createWriteStream创建一个可写流,使用标记“a”进行附加。这将为我创建或打开要写入数据的文件 使用writeStream.write()将数据写入我的日志文件 除以下两种情况外,这一点非常有效: 我在应用程序运行时打开日志文件,更改某些内容,然后保存日志文件 我在应用程序运行时删除日志文件。预期的行为是重新创建文件并保持日志记录 在这两种情况下,我仍然可以调用writeStream.write(),没有错

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

  • 使用
    fs.createWriteStream
    创建一个可写流,使用标记“a”进行附加。这将为我创建或打开要写入数据的文件
  • 使用
    writeStream.write()
    将数据写入我的日志文件
  • 除以下两种情况外,这一点非常有效:

  • 我在应用程序运行时打开日志文件,更改某些内容,然后保存日志文件
  • 我在应用程序运行时删除日志文件。预期的行为是重新创建文件并保持日志记录
  • 在这两种情况下,我仍然可以调用
    writeStream.write()
    ,没有错误

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

    我的问题是:

  • 为什么外部修改和保存日志文件会导致
    writeStream.write()
    停止向我的文件写入数据?我怎么修理它
  • 为什么从外部删除我的日志文件会导致
    writeStream.write()
    停止向我的文件写入数据?我怎么修理它
  • 就写流而言,一切正常。当您删除文件时,实际上是在删除目录中的一个条目,但原始inode没有被删除,并且打开它的应用程序一直在向磁盘写入,只是您没有指向它的指针(dir条目),因此无法看到。您会注意到,可用磁盘空间不断减少,这表明确实写入了内容。当应用程序关闭文件时,它将被删除(因为没有指向它的引用),此时可用磁盘空间将再次增加


    您尝试执行的标准操作是向应用程序发送信号(
    SIGHUP
    SIGUSR1
    ),然后在信号处理程序中关闭应用程序并重新打开文件。这称为“日志旋转”。有许多节点包可以为您完成此操作,您也可以自己完成此操作:-)

    谢谢您的提醒!你能告诉我如何发送信号的正确方向吗?取决于你从哪里发送信号。如果是命令行或shell脚本,则
    kill-SIGHUP pid
    。node、Python、Ruby等中都有等价的库函数。