Node.js child_process 启动子进程、关闭进程和所有子进程

启动子进程

Node.js 提供了 3 个 API 用来启动子进程:spawn、execFile、exec。

spawn

spawn 是启动子进程的底层函数,它可以启动一个二进制程序,但不能启动如 .sh/.bat 之类的批处理文件,自然也不支持 Shell(Bash/Cmd) 命令。

const child_process = require("child_process")
const result = child_process.spawnSync("node", ["-p", "1+1"])
console.log(result.stdout.toString())

execFile

execFile 是对 spawn 的封装,它允许同时书写命令行参数。

execFile('node -p 1+1') 等价于 spawn('node', ["-p", "1+1"])

exec

exec 是对 spawn 的封装,它允许执行 Shell(Bash/Cmd) 命令。

execFile('node -p 1+1') 等价于 execFile('cmd /k /c /d "node -p 1+1"')

bufferSize 陷阱

使用 exec 时,由于 Node.js 内置限制了 maxBuffer 为默认 200k,输出超出后,程序会被自动终止。
因此使用 exec 时应注意输出,或者改用 spawn
如果希望用户和 exec 一样简单,可以考虑 NPM 包:cross-spawn

停止子进程

直接调用子进程的 kill() 可以关闭子进程。
但是无法关闭子进程打开的其它子进程。

需要让子进程独立运行,然后通过进程 ID 结束进程和子进程。

var process = child_process.exec("...")
killByPid(process.pid)

function killByPid(pid){
    if (/^win/.test(process.platform)) {
        child_process.spawn("taskkill", ["/PID", pid, "/T", "/F"])
    } else {
        process.kill(-pid, 'SIGTERM')
    }
}
打赏
微信扫一扫支付
这篇文章对你有用?
微信logo 微信扫一扫,打赏 1 元表示支持吧~

发表评论

电子邮件地址不会被公开。