我使用以下代码生成一个子进程,要求用户输入,然后它应该完成,但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会阻止它终止正确,但我无法弄清楚为什么。我在这里错过了一些明显的东西吗?
答案 0 :(得分:0)
我已直接写入stdin上的子进程并处理它,但在子进程的stdout上附加了一个'finish'事件的监听器。也许它适用于您的用例场景,也许不适用。
如果它有帮助你可以阅读我用来实现它的代码。 code here。 请注意代码仍然有点混乱,这是生成一个模块的基本方法,允许子进程在非root父进程中使用sudo权限运行Linux命令;为了做到这一点,我需要一种方法来提供sudo的密码。我们的想法是允许密码从配置文件,stdin提示符传入,或者从异步中解析,例如从数据库中获取密码,在数据库中可以加密存储密码,并且可能在此过程中未加密。最终我想重新审视该代码并重新编写它,所以你看到的只是概念验证/实验。它也是用ES6 +编写的(箭头函数,承诺,类,构造函数)。