节点并与子进程对话
Node and talking to child processes
上下文
编写串行监视器来监听 Arduino 并不难。使用端口名称和波特率的命令行参数启动它很简单,因此从节点配置和启动监视器并不复杂:
child_process.exec("./monitor COM6 115200");
这个问题涉及exec
、fork
和spawn
,它们很相似,但有一些我还没有掌握的微妙之处。除了带参数启动外,我还需要
- 捕获输出,以便我可以在 window
中显示它
- 杀死子进程
- 使用不同的参数重新启动
- 刷新 Arduino,然后在重启后重新启动
我使用 netcore 编写了一个控制台应用程序,该应用程序接受两个命令行参数,然后连接并监听,回显其 stdout
。我选择netcore是因为它可以在所有三个平台上运行。
问题
我应该使用 exec
、fork
和 spawn
中的哪一个?
如何终止子进程?
如何捕获子进程的stdout
?
Node 文档讨论 kill method on a subprocess
object。该页面上的示例代码暗示此对象由 spawn
返回,但当我使用 spawn 时,它似乎无声地失败了。那个或者它正在工作,但我不知道我在做什么,这就是我提出这个问题的原因。
所有这些 Node 代码都将成为 VSCode 扩展的一部分,所以如果您也知道这些,我想在可能的情况下将 stdout 通过管道传输到 VSCode OutputChannel。
借助 spawn,您可以收听标准输出。
然后使用 kill()
终止进程
来自 NodeJS 官方文档:
const { spawn } = require('child_process');
const ls = spawn('ls', ['-lh', '/usr']);
ls.stdout.on('data', (data) => {
console.log(`stdout: ${data}`);
});
ls.stderr.on('data', (data) => {
console.error(`stderr: ${data}`);
});
ls.on('close', (code) => {
console.log(`child process exited with code ${code}`);
});
// some logic
ls.kill()
编辑:一个更具体的例子:
// server.js --------------
const http = require('http');
const server = http.createServer(
(function() {
console.log('Initializing server');
return (req, res) => {
res.end('Hello World');
};
})()
);
server.listen(8080, () => console.log('Server is up on port ' + 8080));
// spawn.js --------------
const { spawn } = require('child_process');
const child = spawn('node', ['./server.js']);
child.stdout.on('data', data => console.log(data.toString()));
child.stderr.on('data', data => console.log('Error: ' + data));
child.on('close', code => console.log(`Process ended with code ${code}`));
child.on('error', err => console.log(err));
setTimeout(() => child.kill(), 2000);
上下文
编写串行监视器来监听 Arduino 并不难。使用端口名称和波特率的命令行参数启动它很简单,因此从节点配置和启动监视器并不复杂:
child_process.exec("./monitor COM6 115200");
这个问题涉及exec
、fork
和spawn
,它们很相似,但有一些我还没有掌握的微妙之处。除了带参数启动外,我还需要
- 捕获输出,以便我可以在 window 中显示它
- 杀死子进程
- 使用不同的参数重新启动
- 刷新 Arduino,然后在重启后重新启动
我使用 netcore 编写了一个控制台应用程序,该应用程序接受两个命令行参数,然后连接并监听,回显其 stdout
。我选择netcore是因为它可以在所有三个平台上运行。
问题
我应该使用 exec
、fork
和 spawn
中的哪一个?
如何终止子进程?
如何捕获子进程的stdout
?
Node 文档讨论 kill method on a subprocess
object。该页面上的示例代码暗示此对象由 spawn
返回,但当我使用 spawn 时,它似乎无声地失败了。那个或者它正在工作,但我不知道我在做什么,这就是我提出这个问题的原因。
所有这些 Node 代码都将成为 VSCode 扩展的一部分,所以如果您也知道这些,我想在可能的情况下将 stdout 通过管道传输到 VSCode OutputChannel。
借助 spawn,您可以收听标准输出。
然后使用 kill()
终止进程来自 NodeJS 官方文档:
const { spawn } = require('child_process');
const ls = spawn('ls', ['-lh', '/usr']);
ls.stdout.on('data', (data) => {
console.log(`stdout: ${data}`);
});
ls.stderr.on('data', (data) => {
console.error(`stderr: ${data}`);
});
ls.on('close', (code) => {
console.log(`child process exited with code ${code}`);
});
// some logic
ls.kill()
编辑:一个更具体的例子:
// server.js --------------
const http = require('http');
const server = http.createServer(
(function() {
console.log('Initializing server');
return (req, res) => {
res.end('Hello World');
};
})()
);
server.listen(8080, () => console.log('Server is up on port ' + 8080));
// spawn.js --------------
const { spawn } = require('child_process');
const child = spawn('node', ['./server.js']);
child.stdout.on('data', data => console.log(data.toString()));
child.stderr.on('data', data => console.log('Error: ' + data));
child.on('close', code => console.log(`Process ended with code ${code}`));
child.on('error', err => console.log(err));
setTimeout(() => child.kill(), 2000);