我正在使用nodejs应用程序(expressjs,请求等)在Web主机上托管网站。 Web主机具有一个apache终端,我可以从该终端调用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
进程?
我实际的nodejs app.js
是一个典型的expressjs Web应用程序,其代码如下(示例代码简化):
var app = express();
app.use(express.static('..//'))
.use(cors())
.use(cookieParser());
...
app.post('/profile', function(req,res){
"use strict";
var id = req.query.id;
con.query("SELECT * FROM xxxxxxx WHERE xxxxx=" + id, function(err,result){
res.send(result);
});
});
...
app.get('*', function(req, res) {
"use strict";
res.redirect('/404.html');
});
console.log('Listening on 8080');
app.listen(8080);
关于为什么发生此问题的任何想法?我是Node的新手,因此不胜感激,如果遇到任何菜鸟错误,我们深表歉意。
答案 0 :(得分:0)
所以看来问题实际上出在我的~/.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实例。
答案 1 :(得分:-1)
您使用 Visual Code 扩展“Visual Studio IntelliCode”吗? 如果是,请尝试删除它。没有更多的“叉形炸弹”。别问我为什么。我只知道经过 3 个小时的打击,我终于找到了停止节点分叉进程的方法。
上下文:Windows 上的 Visual Code,通过 VS Code 上的远程 SSH 插件访问带有 Ubuntu 服务器的 VPS。安装了 NVM。如果我删除 NVM 和/或删除 ~/.bashrc 中的导出行,则不会发生任何事情。创建了数千个 Zumbi 进程。我删除了 Visual Studio IntelliCode 扩展和 Voilá!一切正常。