截断将STDOUT重定向到它的文件

时间:2013-09-26 23:34:57

标签: node.js filesystems stdout

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

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

从我的节点程序内部,我想重置日志,以防止它变得太大。我尝试fs.truncatefs.open('/var/log/app.out', 'w')来重置它的长度,但当我尝试使用lsstat验证文件大小时,文件大小似乎很快重置为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正在被重定向到的文件?

2 个答案:

答案 0 :(得分:1)

  

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

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

  

如何在不中断节点应用程序的情况下截断STDOUT正在被重定向到的文件?

请勿使用stdout重定向并写入文件。如果您无法修改您的应用,请编写另一个使用更聪明方法的应用,并将stdout重定向到它:node app.js | node write-stdin-to-app.out.js

答案 1 :(得分:1)

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

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

现在,您可以使用fs.truncate或甚至:

截断文件

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