Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.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:检测到使用fs.createWriteStream()打开的文件被删除_Javascript_Node.js_Stream_Filesystems_Fs - Fatal编程技术网

Javascript Node.js:检测到使用fs.createWriteStream()打开的文件被删除

Javascript Node.js:检测到使用fs.createWriteStream()打开的文件被删除,javascript,node.js,stream,filesystems,fs,Javascript,Node.js,Stream,Filesystems,Fs,假设我有以下节点程序,一台机器发出“Ping!”: 每隔一秒钟,它将向控制台打印一条消息,并将其附加到日志文件(如果需要,它将在启动时创建日志文件)。一切都很好 但是现在,如果在进程运行时删除machine.log文件,它将继续愉快地运行,但是写入将不再成功,因为该文件已丢失。但是看起来写操作会无声地失败,这意味着我需要显式地检查这种情况。我已经搜索过了,但似乎找不到发生此类事件时发出的明显事件。write()的返回值也没有用处 如何检测正在写入的文件何时被删除,以便尝试重新打开或重新创建该文件

假设我有以下节点程序,一台机器发出“Ping!”:

每隔一秒钟,它将向控制台打印一条消息,并将其附加到日志文件(如果需要,它将在启动时创建日志文件)。一切都很好

但是现在,如果在进程运行时删除
machine.log
文件,它将继续愉快地运行,但是写入将不再成功,因为该文件已丢失。但是看起来写操作会无声地失败,这意味着我需要显式地检查这种情况。我已经搜索过了,但似乎找不到发生此类事件时发出的明显事件。
write()
的返回值也没有用处


如何检测正在写入的文件何时被删除,以便尝试重新打开或重新创建该文件?这是一个CentOS框,如果相关的话。

写入实际上不会失败

当您删除在另一个程序中打开的文件时,您正在删除指向该文件inode的命名链接。打开它的程序仍然指向该inode。它会很高兴地继续向它写入,实际上是向磁盘写入。只是现在您没有办法查看它,因为您删除了对它的命名引用。(如果有其他参考资料,例如硬链接,您仍然可以!)

这就是为什么那些希望日志文件“消失”的程序(比如说b/c的
logrotate
)通常支持一个信号(通常是
SIGHUP
,有时是
SIGUSR1
),告诉他们关闭文件(此时文件确实消失了,因为现在到处都没有指向它的链接)并重新创建它


你也应该考虑这样的事情。< / P >啊,这是有道理的。我以前见过这种情况,但我从来没有想到会发生同样的行为。我想知道,如果一个更严重的问题使文件实际上无法写入(磁盘故障等),会发生什么情况——节点进程会收到通知,还是整个事情就这样结束了?底层操作系统会让节点处理一个适当的
errno
。我不确定这是否会从节点的io层一直到
类,然后一直到应用程序。我假设它将从doc:
SIGUSR1
由Node.js保留以启动调试器。可以安装侦听器,但这样做可能会干扰调试器。或者使用或多平台包装器,或者使用比流速度慢但对文件删除鲁棒性强的包装器。
var machine = require('fs').createWriteStream('machine.log', {
    flags    : 'a',
    encoding : 'utf8',
    mode     : 0644
});

setInterval(function () {
    var message = 'Ping!';
    console.log(message);
    machine.write(message + '\n');
}, 1000);