如何用Node.js催生一个子进程

40 阅读1分钟

了解如何用Node.js催生一个子进程

Node.js提供了一个child_process 模块,提供了催生子进程的能力。

需要该模块,并从它那里获得spawn 函数。

const { spawn } = require('child_process')

然后你可以通过2个参数调用spawn()

第一个参数是要运行的命令。

第二个参数是一个包含选项列表的数组。

这里有一个例子。

spawn('ls', ['-lh', 'test'])

在这种情况下,你运行带有2个选项的ls 命令:-lhtest 。这导致了命令ls -lh test ,(考虑到test 文件存在于你运行此命令的同一文件夹中),结果是关于该文件的详细信息。

-rw-r--r--  1 flaviocopes  staff     6B Sep 25 09:57 test

spawn() 函数调用的结果是一个ChildProcess 类的实例,该实例标识了被催生的子进程。

这里有一个稍微复杂的例子,完全可以工作。我们观察test 文件,只要它有变化,我们就对它运行ls -lh 命令。

'use strict'

const fs = require('fs')
const { spawn } = require('child_process')
const filename = 'test'

fs.watch(filename, () => {
  const ls = spawn('ls', ['-lh', filename])
})

有一件事没做。我们必须将子进程的输出管道到主进程,否则我们将看不到它的任何输出。

我们通过调用子进程的stdout 属性上的pipe() 方法来做到这一点。

'use strict'

const fs = require('fs')
const { spawn } = require('child_process')
const filename = 'test'

fs.watch(filename, () => {
  const ls = spawn('ls', ['-lh', filename])
  ls.stdout.pipe(process.stdout)
})