2016-12-21 11 views
0

다음 코드를 사용하여 사용자에게 입력을 요청한 다음 완료해야하는 자식 프로세스를 생성하지만 close 이벤트는 절대로 실행되지 않습니다. 나는 사용자 입력하라는 메시지를 표시하지 않는 프로세스를 생성하는 경우NodeJS 자식 프로세스가 STDIN에 쓸 때 닫기 이벤트를 발생시키지 않습니다.

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

이 코드는있는 그대로 작동합니다. 'bc'라고 입력하고 'quit'을 입력하십시오. 문제는 당신이 나가야한다고 생각하는 조건 하에서 실제로 나오지 않는 것으로 산다. – pvg

답변

0

stdin을 통해 하위 프로세스에 직접 작성하고 처리했지만 하위 프로세스의 stdout에 'finish'이벤트에 대한 수신기를 연결했습니다. 아마도 유스 케이스 시나리오에 적용될 것입니다. 아마도

당신이 그것을 구현하는 데 사용했던 코드를 읽을 수 있습니다. code here. 코드가 약간 지저분하다는 점에 유의하십시오. 자식 프로세스가 루트가 아닌 부모 프로세스 내에서 sudo 권한을 사용하여 Linux 명령을 실행할 수 있도록하는 모듈을 만드는 기본 접근 방식입니다. 이렇게하기 위해 나는 sudo를위한 패스워드를 제공 할 방법이 필요했다. 아이디어는 암호를 설정 파일 (stdin prompt)에서 전달할 수있게하거나 약속 저장 프로 시저 (Promise)에서 비동기 적으로 해결할 수 있도록하는 것이 었습니다. 결국 나는 그 코드를 재검토하고 훨씬 더 잘 쓰고 싶다. 그래서 당신이 보는 것은 개념/실험의 증거 일 뿐이다. 또한 그것은 ES6 + (Arrow Functions, Promises, Classes, Constructors)로 작성되었습니다.