前因

最近在写这个 博客项目 的时候,因为内嵌了 waline.js 作为子进程,所以有时候需要停止子进程并重启(传递给子进程新的配置)

但正常通过 childprocess.exit() 时,发现并没有完全退出,重启会报错 端口被占用

这是因为子进程往往还会产生出子进程,无法被 kill() 掉。

解决方法

在使用 spawn 时,增加 detached: true 参数,让子进程在一开始就和父进程分离。然后在需要结束的地方:

js

childprocess = spawn('node something.js',[],{detached: true})

js

childprocess.unref(); # -号表示结束以pid为首的整个进程树 process.kill(-childprocess.pid)

参考文章

如何正确地结束NodeJS子进程 - 避坑