Node.js 未使用PID nodejs、express、Docker终止子进程
我正在尝试创建一个子进程来建立远程访问。进程本身运行良好,但我很难终止进程。进程被杀死,但再次繁殖。我也尝试过使用exec和execFile,但都不起作用。我是node的初学者,如果有任何小错误,请原谅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
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本身无法控制吗?您可以在容器中设置自己的守护进程,该容器管理此进程并使用自己的通信。