2017-10-14 14 views
0

나는 약간의 자유 시간을 가졌으므로 자바 스크립트 (NodeJS - ES6)의 모든 bash 스크립트를 자식 프로세스로 다시 작성하기로 결정했다. 사용자 입력을 자동화하고 싶을 때까지 모든 것이 순조롭게 진행되었습니다.nodejs 자식 프로세스가 입력을 원하거나 피드백 만 보내고 있는지 판단 할 수있는 방법이 있습니까?

예, 사용자 입력을 자동화 할 수 있습니다. 그러나 한 가지 문제가 있습니다. 주어진 data 이벤트가 피드백인지 또는 입력 요청인지 판단 할 수 없습니다. 적어도 나는 그것을 할 방법을 찾을 수 없습니다.

그래서 기본적으로 당신은이 작업을 수행 할 수 있습니다

// new Spawn. 
let spawn = require('child_process'); 
// new ufw process. 
let ufw = spawn('ufw', ['enable']); 

// Use defined input. 
ufw.stdin.setEncoding('utf-8'); 
ufw.stdout.pipe(process.stdout); 
ufw.stdin.write('y\n'); 

// Event Standard Out. 
ufw.stdout.on('data', (data) => { 
    console.log(data.toString('utf8')); 
}); 

// Event Standard Error. 
ufw.stderr.on('data', (err) => { 
    // Logerror. 
    console.log(err); 
}); 

// When job is finished (with or without error) it ends up here. 
ufw.on('close', (code) => { 
    // Check if there were errors. 
    if (code !== 0) console.log('Exited with code: ' + code.toString()); 
    // End input stream. 
    ufw.stdin.end(); 
}); 

위의 예는 완전히 잘 작동합니다.

  1. ufw.stdin.write('y\n'); 대기가이 필요할 것까지 내가 여러 개의 입력을하면 어떻게됩니까 :하지만 나에게 두통을주는 2 가지가있다? 예 : '예', '예', '아니오'. stdin.write() 세 줄을 써야합니까?

  2. 내가 사용하는 위치가 아닌가 ufw.stdin.write('y\n'); 조금 혼란 스럽습니까? 내 프롬프트가 입력 요청을 한 후에 입력이 필요하다고 생각하여 내 stdin.write()이 올바른 시간에 실행될 수 있다는 코드를 변경하기로 결정했다. 그러나 '올바른 시간'이 stdout.on('data', callback) 이벤트에 있는지 확인하는 유일한 방법입니다. 내가 프롬프트가 사용자 입력 여부에 대한 aksing 경우 알 필요가 있기 때문에 만드는 여기

완전히 잘못된 내가 생각하는 내 코드입니다 ... 조금 어려운 생각 :

// new Spawn. 
let spawn = require('child_process'); 
// new ufw process. 
let ufw = spawn('ufw', ['enable']); 

// Event Standard Out. 
ufw.stdout.on('data', (data) => { 
    console.log(data.toString('utf8')); 

    // Use defined input. 
    ufw.stdin.setEncoding('utf-8'); 
    ufw.stdout.pipe(process.stdout); 
    ufw.stdin.write('y\n'); 
}); 

// Event Standard Error. 
ufw.stderr.on('data', (err) => { 
    // Logerror. 
    console.log(err); 
}); 

// When job is finished (with or without error) it ends up here. 
ufw.on('close', (code) => { 
    // Check if there were errors. 
    if (code !== 0) console.log('Exited with code: ' + code.toString()); 
    // End input stream. 
    ufw.stdin.end(); 
}); 

나의 주요 오해는 사용자 입력 (자동)에 stdin을 사용할시기와 코드에 입력 할 위치를 적시하여 예를 들어 mysql_secure_installation과 같은 입력을 여러 번 입력하는 경우와 같이 적절한시기에 사용됩니다.

답변

0

가능한지 궁금 해서요. https://github.com/nodejs/node/issues/16214

I am asking for a way to determine if the current process is waiting for an input. 

하나가되지 않습니다 : 내가 폐쇄에 beeing 결국 노드에 대한 문제를 기록했다. 파이프 I/O 에 대한 잘못된 기대를 가지고 있다고 생각합니다. 단순히 작동하는 방식이 아니기 때문입니다.

기대치에 대해 말하면 기대치를 확인하십시오. 주위를 둘러 보면 아마도 node.js 포트가있을 것입니다.

기능으로 구현할 수 없기 때문에 이것을 닫을 것이고은 질문으로 nodejs/help가 더 적절한 장소입니다.

누구나 내가 가지고있는 것과 같은 문제가 있다면 stdin에 여러 줄을 쓰고 미리 정의 된 값으로 사용할 수 있습니다.사람이 수동으로 단순히 주어진 시작할 수있는 사용자 입력을 채우기 위해 원하는 경우 완성도를 위해서

// new Spawn. 
let spawn = require('child_process'); 
// new msqlsec process. 
let msqlsec = spawn('mysql_secure_installation', ['']); 
// Arguments as Array. 
let inputArgs = ['password', 'n', 'y', 'y', 'y', 'y']; 

// Set correct encodings for logging. 
msqlsec.stdin.setEncoding('utf-8'); 
msqlsec.stdout.setEncoding('utf-8'); 
msqlsec.stderr.setEncoding('utf-8'); 

// Use defined input and write line for each of them. 
for (let a = 0; a < inputArgs.length; a++) { 
    msqlsec.stdin.write(inputArgs[a] + '\n'); 
} 

// Event Standard Out. 
msqlsec.stdout.on('data', (data) => { 
    console.log(data.toString('utf8')); 
}); 

// Event Standard Error. 
msqlsec.stderr.on('data', (err) => { 
    // Logerror. 
    console.log(err); 
}); 

// When job is finished (with or without error) it ends up here. 
msqlsec.on('close', (code) => { 
    // Check if there were errors. 
    if (code !== 0) console.log('Exited with code: ' + code.toString()); 
    // close input to writeable stream. 
    msqlsec.stdin.end(); 
}); 

: 모든 입력 기능 업데이트에 깨지거나 잘못되면 결국 스트림을 깰 것 명심 다음과 같이 처리하십시오 :

// new msqlsec process. 
let msqlsec = spawn('mysql_secure_installation', [''], { stdio: 'inherit', shell: true });