我有一个节点应用程序,它将STDOUT重定向到日志文件:
node app.js > /var/log/app.out
从我的节点程序内部,我想重置日志,以防止它变得太大。我尝试fs.truncate
和fs.open('/var/log/app.out', 'w')
来重置它的长度,但当我尝试使用ls
或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正在被重定向到的文件?
答案 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