簡體   English   中英

Web 服務器上的 nodejs 應用程序導致 fork 炸彈 - bash:fork:重試:沒有子進程

[英]nodejs application on web server causing fork bomb - bash: fork: retry: No child processes

我正在使用 nodejs 應用程序(expressjs、請求等)在網絡主機上托管網站。 網絡主機有一個 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使用fork()來啟動我的應用程序,日志沒有顯示錯誤或正在創建新進程的跡象。

發生這種情況時,我有一半時間無法使用任何終端命令,直到我設法 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);

關於為什么會發生此問題的任何想法? 我對節點相對較新,因此感謝任何幫助,如果出現任何菜鳥錯誤,我深表歉意。

因此,問題似乎實際上源於我的~/.bashrc文件,其中包含以下~/.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 Code 擴展“Visual Studio IntelliCode”? 如果是,請嘗試刪除它。 沒有更多的“叉形炸彈”。 別問我為什么。 我只知道經過 3 個小時的打擊,我終於找到了停止節點分叉進程的方法。

上下文:Windows 上的 Visual Code,通過 VS Code 上的遠程 SSH 插件訪問帶有 Ubuntu 服務器的 VPS。 安裝了 NVM。 如果我刪除 NVM 和/或刪除 ~/.bashrc 中的導出行,則不會發生任何事情。 創建了數千個 Zumbi 進程。 我刪除了 Visual Studio IntelliCode 擴展和 Voilá! 一切都好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM