Node.js 未使用PID nodejs、express、Docker终止子进程

Node.js 未使用PID nodejs、express、Docker终止子进程,node.js,docker,express,child-process,zombie-process,Node.js,Docker,Express,Child Process,Zombie Process,我正在尝试创建一个子进程来建立远程访问。进程本身运行良好,但我很难终止进程。进程被杀死,但再次繁殖。我也尝试过使用exec和execFile,但都不起作用。我是node的初学者,如果有任何小错误,请原谅 app.post('/:vdms_id/:docker_id/:tool', async(req, res) => { let vdms_id = req.params.vdms_id; let docker_id = req.params.docker_id; l

我正在尝试创建一个子进程来建立远程访问。进程本身运行良好,但我很难终止进程。进程被杀死,但再次繁殖。我也尝试过使用exec和execFile,但都不起作用。我是node的初学者,如果有任何小错误,请原谅

app.post('/:vdms_id/:docker_id/:tool', async(req, res) => {
    let vdms_id = req.params.vdms_id;
    let docker_id = req.params.docker_id;
    let tool = req.params.tool;

        switch (tool) {
            case 'remote-access':
                try{
                    if(req.body.host){
                    
                    //Run remote access commands here
                    const child = spawn("docker",["exec",`${docker_id}`,"tcptunnel",`--local-port=${req.body.free_port}`,`--remote-port=${req.body.private_port}`,`--remote-host=${req.body.private_ip}`,"--stay-alive","--fork"]);

                    // Write PID along with private IP and port to DB here
                    await new RemoteAccess({
                        pid:child.pid,
                        username:req.body.username,
                        vdms_id:vdms_id,
                        docker_id:docker_id,
                        free_port:req.body.free_port,
                        private_ip:req.body.private_ip,
                        private_port:req.body.private_port,
                        timestamp:Date.now()
                    }).save();

                    console.log('PID WAS SAVED TO DB');

                    return res.json({success:true});

                    }
                    
                    case 'end-remote-access':
                     let result = await RemoteAccess.findOne({private_port:req.body.private_port,username:req.body.username});
                     console.log("REMOTE_ACCESS",result);

                    // Kill the child process here
                      process.kill(result.pid);

问题是您正在将一个参数传递给
tcptunnel
-
--fork
,这意味着创建一个新流程,而该流程不再由
exec
跟踪


因此,您可能需要停止或重新启动容器以终止此操作。

我想运行此命令一段时间,然后使用其PID终止它。如果删除--stay alive标志,进程将在几分钟内自动终止seconds@NikhilAdiga如果要删除
--fork
,请在查看此工具的源代码后删除错误信息--活着不是问题,但是,福克可能是。不幸的是,“保持活力”在任何地方都没有文档记录,但是源代码非常清楚。如果我删除fork,当这个端口上有大量流量时,这将是一个问题。使用nodejs本身无法控制吗?您可以在容器中设置自己的守护进程,该容器管理此进程并使用自己的通信。