CNode

如何在node服务关闭的时候杀死子进程

问答
Jjocchoc发布于8 年前最后回复8 年前7 回复7441 浏览0 收藏

所遇问题

现有一个与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)

A
atian25#1·8 年前

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

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

L
lblblong#2·8 年前

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

A
atian25#3·8 年前
引用 lblblongprocess.kill( process.pid) 试下这个,在关闭的时候调用一下这个代码

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

Z
zswnew#4·8 年前

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

来自酷炫的 CNodeMD

B
blackmatch#5·8 年前

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

const cp = child.exec(cmd);

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

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

Z
zhulinwei#6·8 年前
引用 atian25@lblblong 这并不是关键点,关键点在于:父进程异常退出的时候,也要优雅的干掉子进程

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

U
ugrg#7·8 年前

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

参与回复
登录后即可参与回复。登录