【问题标题】:Child process not getting killed using PID nodejs, express, Docker子进程没有被使用 PID nodejs、express、Docker 杀死
【发布时间】:2020-08-09 04:36:41
【问题描述】:

我正在尝试创建一个子进程来建立远程访问。该过程本身运行良好,但我很难终止该过程。该进程被杀死但再次产生。我也尝试过使用 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);

【问题讨论】:

    标签: node.js docker express child-process zombie-process


    【解决方案1】:

    问题是您将参数传递给tcptunnel - --fork,这意味着创建一个不再被exec 跟踪的新进程

    因此您可能需要停止或重新启动容器才能杀死它。

    【讨论】:

    • 我想运行这个命令一段时间,然后使用它的 PID 杀死它。如果我删除 --stay-alive 标志,该进程会在几秒钟内自动终止
    • @NikhilAdiga 如果你删除 --fork 会怎样?
    • 在查看此工具的来源后删除了虚假信息。 --stay-alive 不是这里的问题,但 --fork 可能是。不幸的是 --stay-alive 实际上并没有在任何地方记录,但源代码非常清晰。
    • 如果我去掉fork,当这个端口流量大的时候,就会出问题。有没有办法使用nodejs本身来控制它?。
    • 你可以在容器内设置你自己的守护进程来管理它并使用你自己的通讯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-30
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    • 2013-11-12
    • 2013-10-27
    相关资源
    最近更新 更多