1

我有一个节点应用程序,它的 STDOUT 被重定向到日志文件:

node app.js > /var/log/app.out

从我的节点程序内部,我想重置日志以防止它变得太大。我已经尝试fs.truncatefs.open('/var/log/app.out', 'w')为了重置它的长度,但是当我尝试使用lsor验证文件大小stat时,文件大小似乎很快重置为 0,然后重置为以前的大小加上新消息(我目前强制很多输出)。

root@ubuntu-1304-mike:/var/log# stat app.out
  File: ‘app.out’
  Size: 5885622     Blocks: 16         IO Block: 4096   regular file
Device: fc00h/64512d    Inode: 270560      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2013-09-26 17:20:06.784564421 -0600
Modify: 2013-09-26 17:20:49.088565625 -0600
Change: 2013-09-26 17:20:49.088565625 -0600
 Birth: -
root@ubuntu-1304-mike:/var/log# stat app.out
  File: ‘app.out’
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: fc00h/64512d    Inode: 270560      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2013-09-26 17:20:06.784564421 -0600
Modify: 2013-09-26 17:20:51.772565702 -0600
Change: 2013-09-26 17:20:51.772565702 -0600
 Birth: -
root@ubuntu-1304-mike:/var/log# stat app.out
  File: ‘app.out’
  Size: 6038458     Blocks: 16         IO Block: 4096   regular file
Device: fc00h/64512d    Inode: 270560      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2013-09-26 17:20:06.784564421 -0600
Modify: 2013-09-26 17:20:53.640565755 -0600
Change: 2013-09-26 17:20:53.640565755 -0600
 Birth: -

似乎 STDOUT 正在将其缓冲区重新写入文件(无论缓冲区有多大)。

如何截断 STDOUT 被主动重定向到的文件,而不会中断我的节点应用程序?

4

2 回答 2

1

似乎 STDOUT 正在将其缓冲区重新写入文件(无论缓冲区有多大)。

没有人重写缓冲区,它已经写在磁盘上。当应用程序完成写入时,它会记住它完成的位置,然后从这个位置开始。这不是节点问题,您对此无能为力,这就是 unix 管道的工作方式(除非有一些丑陋的黑客来倒带我不知道的管道)。

如何截断 STDOUT 被主动重定向到的文件,而不会中断我的节点应用程序?

不要使用标准输出重定向而是写入文件。如果您无法修改您的应用程序,请编写另一个使用更聪明方法的应用程序并将标准输出重定向到它,如下所示:node app.js | node write-stdin-to-app.out.js

于 2013-09-27T06:41:50.683 回答
1

我也遇到了这个问题。使用 append 运算符是解决它的最佳方法:

node app.js >> /var/log/app.out

fs.truncate现在您可以使用甚至截断文件:

echo -n > /var/log/app.out

于 2013-10-24T01:23:58.083 回答