Javascript web服务器上的nodejs应用程序导致fork爆炸-bash:fork:retry:无子进程
我正在使用nodejs应用程序(expressjs、request等)在web主机上托管一个网站。这个web主机有一个apache终端,我可以在那里调用Javascript web服务器上的nodejs应用程序导致fork爆炸-bash:fork:retry:无子进程,javascript,node.js,bash,apache,Javascript,Node.js,Bash,Apache,我正在使用nodejs应用程序(expressjs、request等)在web主机上托管一个网站。这个web主机有一个apache终端,我可以在那里调用node app.js&或forever start app.js,应用程序运行正常。 然而,一旦终端关闭,正在使用的进程数量就会膨胀到大约30个,这意味着下次我打开终端时,不会收到[hostname@server~]$我得到的是: bash: fork: retry: No child processes bash: fork: retry:
node app.js&
或forever start app.js
,应用程序运行正常。
然而,一旦终端关闭,正在使用的进程数量就会膨胀到大约30个,这意味着下次我打开终端时,不会收到[hostname@server~]$
我得到的是:
bash: fork: retry: No child processes
bash: fork: retry: No child processes
bash: fork: retry: No child processes
bash: fork: retry: No child processes
bash: fork: Resource temporarily unavailable
bash-4.2$
不知怎的,我相信有人在制造叉形炸弹,但我似乎不知道在哪里,为什么?我没有在任何地方使用fork()
,如果我使用forever
启动我的应用程序,日志中没有显示错误或正在创建新进程的迹象
发生这种情况时,我有一半时间不能使用任何终端命令,直到我成功地使用了pkill/pgrep
我试着打电话给bash-4.2$top,结果是:
top - 13:41:13 up 71 days, 20:57, 0 users, load average: 1.82, 1.81, 1.72
Tasks: 14 total, 1 running, 2 sleeping, 11 stopped, 0 zombie
%Cpu(s): 11.7 us, 2.7 sy, 0.1 ni, 85.5 id, 0.1 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 41034544 total, 2903992 free, 6525792 used, 31604760 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 28583704 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1001511 xxxxxxxx 20 0 11880 3692 1384 S 0.0 0.0 0:00.02 bash
1001578 xxxxxxxx 20 0 11880 2840 524 T 0.0 0.0 0:00.00 bash
1001598 xxxxxxxx 20 0 11880 2672 348 T 0.0 0.0 0:00.00 bash
1001599 xxxxxxxx 20 0 11880 2896 524 T 0.0 0.0 0:00.00 bash
1001600 xxxxxxxx 20 0 11880 2720 396 T 0.0 0.0 0:00.00 bash
1001607 xxxxxxxx 20 0 11880 2928 532 T 0.0 0.0 0:00.00 bash
1001613 xxxxxxxx 20 0 11880 2964 532 T 0.0 0.0 0:00.00 bash
1001618 xxxxxxxx 20 0 11880 2780 348 T 0.0 0.0 0:00.00 bash
1001619 xxxxxxxx 20 0 12012 3024 544 T 0.0 0.0 0:00.00 bash
1001620 xxxxxxxx 20 0 11880 2804 372 T 0.0 0.0 0:00.00 bash
1001651 xxxxxxxx 20 0 12012 2836 352 T 0.0 0.0 0:00.00 bash
1001653 xxxxxxxx 20 0 12016 3392 896 T 0.0 0.0 0:00.00 bash
1004463 xxxxxxxx 20 0 9904 1840 1444 S 0.0 0.0 0:00.00 bash
1005200 xxxxxxxx 20 0 56364 1928 1412 R 0.0 0.0 0:00.00 top
这看起来像是在重复执行bash
过程
我的实际nodejsapp.js
是一个典型的expressjs web应用程序,代码如下(缩写示例代码):
关于为什么会发生这个问题有什么想法吗?我对node比较陌生,因此非常感谢您提供的任何帮助,如果出现任何noob错误,我将表示歉意。因此,似乎问题实际上源自我的
~/.bashrc
文件,其中包含以下行:
# User specific aliases and functions
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion
如果这些行被注释掉,那么问题就不再发生。但是,我显然不能使用节点命令,因为nvm没有启动
不知何故,只要访问终端,代码就会循环创建多个bash实例。因此,问题似乎实际上源于我的
~/.bashrc
文件,其中包含以下行:
# User specific aliases and functions
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion
如果这些行被注释掉,那么问题就不再发生。但是,我显然不能使用节点命令,因为nvm没有启动
不管怎样,只要访问终端,代码就会循环创建多个bash实例。是否使用可视代码扩展名“Visual Studio IntelliCode”? 如果是,请尝试将其删除。不再有“叉子炸弹”。不要问我为什么。我只知道,经过3个小时的思考,我终于找到了停止节点分叉过程的方法
上下文:Windows上的可视代码,通过VS代码处的远程SSH插件使用Ubuntu服务器访问VPS。NVM已安装。如果我删除NVM和/或删除~/.bashrc处的导出行,则不会发生任何事情。创建了数千个Zumbi进程。我删除了Visual Studio IntelliCode扩展,瞧!一切正常。是否使用可视代码扩展名“Visual Studio IntelliCode”? 如果是,请尝试将其删除。不再有“叉子炸弹”。不要问我为什么。我只知道,经过3个小时的思考,我终于找到了停止节点分叉过程的方法
上下文:Windows上的可视代码,通过VS代码处的远程SSH插件使用Ubuntu服务器访问VPS。NVM已安装。如果我删除NVM和/或删除~/.bashrc处的导出行,则不会发生任何事情。创建了数千个Zumbi进程。我删除了Visual Studio IntelliCode扩展,瞧!一切正常。当你不再使用node app.js时会发生这种情况吗?当你使用node app.js并退出时,这种情况还会发生吗?使用
node app.js&
仍然会导致错误,但它最终会停止应用程序(域发布503错误)当永远保持应用程序运行时,您需要确定NodeJS进程是否正在重新启动,或者NodeJS应用程序是否正在分叉。要做到这一点,我建议在NodeJS应用程序加载开始时将一些简单的东西写入文件。如果该文件中有30个条目,则操作系统会一次又一次地重新启动NodeJS。附带说明:NodeJS是单线程的,不能单独生成/派生进程。现在大多数人都使用NodeCluster来实现这一目的。之前你会看到使用child\u process
。请查看此答案的编辑,了解为什么forever可能会重新启动你的应用程序@RandyCasburn感谢这个想法,我实现了一个脚本,它在应用程序加载时写入调试文本文件,但只追加了一行。然而,从top
命令看来,正在创建的进程是bash
进程?当您不永远使用时会发生这种情况吗?就像在使用node app.js&并退出时一样,它还会发生吗?使用node app.js&
仍然会导致错误,但它最终会停止应用程序(域发布503错误)当永远保持应用程序运行时,您需要确定NodeJS进程是否正在重新启动,或者NodeJS应用程序是否正在分叉。要做到这一点,我建议在NodeJS应用程序加载开始时将一些简单的东西写入文件。如果该文件中有30个条目,则操作系统会一次又一次地重新启动NodeJS。附带说明:NodeJS是单线程的,不能单独生成/派生进程。现在大多数人都使用NodeCluster来实现这一目的。之前你会看到使用child\u process
。请查看此答案的编辑,了解为什么forever可能会重新启动你的应用程序@RandyCasburn感谢这个想法,我实现了一个脚本,它在应用程序加载时写入调试文本文件,但只追加了一行。然而,从top
命令看来,正在创建的进程是bash
进程?
app.get('*', function(req, res) {
"use strict";
res.redirect('/404.html');
});
console.log('Listening on 8080');
app.listen(8080);
# User specific aliases and functions
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion