2016-10-02 90 views
1

我使用forever包來運行我的Node.js腳本。 (不是網絡服務器)。然而,因爲它,我有內存泄漏,甚至停止所有流程後,我的記憶依然採取:永久節點(npm包)服務器上的內存泄漏

[email protected]:~# forever stopall 
info: No forever processes running 
[email protected]:~# forever list 
info: No forever processes running 
[email protected]:~# free -lm 
      total  used  free  shared buffers  cached 
Mem:   11721  6900  4821   5  188  1242 
Low:   11721  6900  4821 
High:   0   0   0 
-/+ buffers/cache:  5469  6252 
Swap:   0   0   0 

另外提一下,有一個從劇本沒有內存泄漏時,沒有永遠本地運行。我在Ubuntu服務器上運行它。如果我現在重新啓動服務器:

[email protected]:~# reboot 

Broadcast message from [email protected] 
     (/dev/pts/0) at 3:19 ... 

The system is going down for reboot NOW! 

我的RAM將重獲自由:

[email protected]:~# free -lm 
      total  used  free  shared buffers  cached 
Mem:   11721  1259  10462   5   64  288 
Low:   11721  1259  10462 
High:   0   0   0 
-/+ buffers/cache:  905  10816 
Swap:   0   0   0 

我也想提一提的是,當我的腳本完成它是做什麼(和它最終不會)我有db.closeprocess.exit調用,以確保從我的腳本一側殺死所有東西。但是,即使在RAM被拿走之後。現在我知道永遠會在死亡後再次運行該腳本。所以我的問題是:

  • 如何永遠告訴不要再次執行腳本,如果它完成?
  • 我該如何正確地停下來,以便在我停止後不需要任何RAM?

我爲此永遠使用包的原因是因爲我的腳本需要很多時間來做它做的事情,而且我的SSH會話會結束,所以我會以普通方式運行節點腳本。

+0

你可能喜歡使用'top'和'htop'命令來查看您的RAM和CPU的使用,然後你可以殺死進程 –

+0

@ArifKhan但是我真的不希望手動終止進程。我正在尋找一種「永遠」包裹來殺死它不再使用的東西。 – Kunok

回答

1

從我所看到的內存不會被帶走或泄漏,它被Linux用作文件系統緩存(因爲未使用的RAM是浪費的RAM)。

從6900 megs的「used」RAM中,5469被用作緩衝區緩存。當進程請求內存時,Linux會自動減少這個數量。

如果你想有一個長期運行的進程繼續運行您註銷後(或後您的SSH會話就會被殺死),你不需要forever各種選項:

  • 後臺進程,確保任何「退出」信號被忽略:

    $ nohup node script.js & 
    
  • 使用終端複用器像tmuxscreen