在写入STDIN时,NodeJS子进程未触发关闭事件

时间:2016-12-21 18:49:35

标签: javascript node.js stdin child-process spawn

我使用以下代码生成一个子进程,要求用户输入,然后它应该完成,但close事件永远不会被触发。

const spawn = require('child_process').spawn;
const p = spawn('script', ['that', 'prompts', 'user', 'for', 'input']);

process.stdin.on('data', (data) => {
  p.stdin.write(data);
});

p.on('close', (code) => {
  console.log(`child process closed with code ${code}`);
});

如果我生成一个不提示输入用户输入的进程(比如ls´), the close`事件就会毫无问题地触发。我怀疑直接写入子进程的父进程的STDIN会阻止它终止正确,但我无法弄清楚为什么。我在这里错过了一些明显的东西吗?

1 个答案:

答案 0 :(得分:0)

我已直接写入stdin上的子进程并处理它,但在子进程的stdout上附加了一个'finish'事件的监听器。也许它适用于您的用例场景,也许不适用。

如果它有帮助你可以阅读我用来实现它的代码。 code here。 请注意代码仍然有点混乱,这是生成一个模块的基本方法,允许子进程在非root父进程中使用sudo权限运行Linux命令;为了做到这一点,我需要一种方法来提供sudo的密码。我们的想法是允许密码从配置文件,stdin提示符传入,或者从异步中解析,例如从数据库中获取密码,在数据库中可以加密存储密码,并且可能在此过程中未加密。最终我想重新审视该代码并重新编写它,所以你看到的只是概念验证/实验。它也是用ES6 +编写的(箭头函数,承诺,类,构造函数)。