我使用forever
包来运行我的Node.js脚本。(不是web服务器)。然而,因为它,我有内存泄漏,甚至在停止所有进程后,我的内存仍然被占用:
root@aviok-cdc-elas-001:~# forever stopall
info: No forever processes running
root@aviok-cdc-elas-001:~# forever list
info: No forever processes running
root@aviok-cdc-elas-001:~# 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服务器上运行它。如果我现在重启服务器:
root@aviok-cdc-elas-001:~# reboot
Broadcast message from root@aviok-cdc-elas-001
(/dev/pts/0) at 3:19 ...
The system is going down for reboot NOW!
我的内存又空闲了:
root@aviok-cdc-elas-001:~# 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.close
和process.exit
调用,以确保一切都是从我的脚本的一边杀死。然而,即使在RAM被拿走之后。现在我知道,永远将再次运行该脚本后,它被杀死。所以我的问题是:
- 我怎么告诉永远不执行脚本再次,如果它是完成的?
- 我如何停止永远正确,所以它不采取任何RAM后,我停止了它?
我使用forever包的原因是因为我的脚本需要很多时间来做它所做的事情,我的SSH会话将结束,我以常规方式运行的Node脚本也是如此。
从我所看到的,RAM没有被拿走,或者泄漏,它被Linux用作文件系统缓存(因为未使用的RAM是浪费的RAM)。
在6900兆的"已用"内存中,5469兆被用作缓冲缓存。当进程请求内存时,Linux会自动减少这个数量。
如果您想要一个长时间运行的进程在您注销之后继续运行(或者在您的SSH会话被终止之后),您有各种不需要forever
的选项:
-
后台进程,确保任何"注销"信号被忽略:
$ nohup node script.js &
-
使用
tmux
或screen
等终端多路复用器