2013-09-26 43 views
1

我有一個是有它的stdout被重定向到一個日誌文件中的節點應用:有STDOUT截斷文件被重定向到它

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

從我的節點計劃裏面我想日誌中,以便重置防止它變得太大。我以重置它的長度試圖fs.truncatefs.open('/var/log/app.out', 'w'),但是當我嘗試使用lsstat驗證文件大小,文件大小似乎很快就重置爲0,然後恢復到它的原來的尺寸再加上新的信息(我目前我迫使大量的輸出)。

[email protected]:/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: - 
[email protected]:/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: - 
[email protected]:/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正在被重定向到一個文件,而不會破壞我的節點的應用程序嗎?

回答

1

似乎STDOUT正在將其緩衝區重新寫入文件(不管緩衝區有多大)。

沒有人重寫緩衝區,它已經寫在磁盤上。當應用程序完成寫入任務時,它會記住完成的位置,並在稍後從此位置開始。這不是一個節點的問題,並沒有什麼可以做這件事,這是UNIX管道是如何工作的(除非有一些醜陋的黑客倒帶管我不知道)。

如何截斷STDOUT正在被重定向到的文件,而不會破壞我的節點應用程序?

請勿使用stdout重定向並寫入文件。如果你不能修改你的應用程序,編寫使用更聰明的做法另一個應用程序和標準輸出重定向到它這樣:node app.js | node write-stdin-to-app.out.js

1

我只是碰到了這個問題,也是如此。使用追加操作是最好的方式來解決這個問題:

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

現在可以截斷該文件與fs.truncate甚至:

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