如何在node服务关闭的时候杀死子进程
发布于 6 年前 作者 jocchoc 6282 次浏览 来自 问答

所遇问题

现有一个与python脚本通信的node服务。 首先:启动node服务一切正常。接口请求的时候执行python脚本,CPU飙升,请求完毕CPU降低 然后:我把node服务关闭的时候,原来的子进程竟然占据着CPU内容不放!

前提

首先:python脚本只能加载一次。不然太耗时。所以每次请求都加载脚本启动子进程然后杀掉不可取。

代码如下

const path = require('path');
const { exec } = require('child_process');
const pyPath = path.join(think.ROOT_PATH, '/src/tools/AIgobang/');
const child = exec('python move.py', { cwd: pyPath});	
...
child.stdin.resume()
child.stdin.write('传入脚本的值')
child.stdout.once('data', (data) => {
	console.log(data)
})

CPU占据情况如下

启动服务状态 1b051d56f9984e509000e0a3fd1e276.png 关闭服务状态 71bcbda81a7973f6ed93bec1a208b81.png

问题罗列

  1. 如何避免node服务关闭后,python进程占据着CPU不放的问题
  2. 我的代码是否有需要优化的地方,例如与子进程通信的性能上
7 回复

你要监听自己的退出事件,然后杀掉子进程啊。

可以用下我们写的 https://github.com/node-modules/graceful-process

process.kill(-process.pid) 试下这个,在关闭的时候调用一下这个代码

@lblblong 这并不是关键点,关键点在于:父进程异常退出的时候,也要优雅的干掉子进程

父进程 fork子进程,子进程再fork孙进城,这时候,父进程可关闭,子进程作为守护进程运行。可百度 linux fork两次

来自酷炫的 CNodeMD

我是这么玩的,代码片段:

const cp = child.exec(cmd);

// 1分钟后将node子进程关掉,只保留执行脚本的进程
const timer = setTimeout(function() {
cp.kill();
console.log('node子进程已关闭');
}, 60 * 1000);

我的使用场景是:程序启动的时候需要使用node执行一次shell命令(只要执行就行了,不需要处理反馈)。

@atian25 childprocess.fork 不是可以自动释放子进程的资源的吗?上述问题使用fork代替exec这样可行?

python脚本可以修改的话,可以在python启动时,注册一个服务,去监听主进程的存活状态,一但主进程消失,则自我毁灭。主进程的pid可以通过起动python时的参数传递过去。

回到顶部