Web服务器上的nodejs应用程序引起fork炸弹-bash:fork:重试:无子进程

时间:2019-05-26 14:14:24

标签: javascript node.js bash apache

我正在使用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的新手,因此不胜感激,如果遇到任何菜鸟错误,我们深表歉意。

2 个答案:

答案 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á!一切正常。