이제 훨씬 쉬워졌습니다 (6 년 후)!
Spawn은 이벤트 를 수신 할 수 있는 childObject를 반환합니다 . 이벤트는 다음과 같습니다.
- 클래스 : ChildProcess
- 이벤트 : '오류'
- 이벤트 : 'exit'
- 이벤트 : '닫기'
- 이벤트 : '연결 끊기'
- 이벤트 : '메시지'
childObject 에는 다음 과 같은 객체 도 있습니다.
- 클래스 : ChildProcess
- child.stdin
- child.stdout
- child.stderr
- child.stdio
- child.pid
- child.connected
- child.kill ([신호])
- child.send (message [, sendHandle] [, 콜백])
- child.disconnect ()
childObject에 대한 자세한 정보는 https://nodejs.org/api/child_process.html을 참조하십시오.
비동기
노드가 계속 실행될 수있는 동안 백그라운드에서 프로세스를 실행하려면 비동기 메서드를 사용하세요. 프로세스가 완료된 후 그리고 프로세스에 출력이있을 때 (예 : 스크립트의 출력을 클라이언트에 보내려는 경우) 작업을 수행하도록 선택할 수 있습니다.
child_process.spawn (...); (노드 v0.1.90)
var spawn = require('child_process').spawn;
var child = spawn('node ./commands/server.js');
// You can also use a variable to save the output
// for when the script closes later
var scriptOutput = "";
child.stdout.setEncoding('utf8');
child.stdout.on('data', function(data) {
//Here is where the output goes
console.log('stdout: ' + data);
data=data.toString();
scriptOutput+=data;
});
child.stderr.setEncoding('utf8');
child.stderr.on('data', function(data) {
//Here is where the error output goes
console.log('stderr: ' + data);
data=data.toString();
scriptOutput+=data;
});
child.on('close', function(code) {
//Here you can get the exit code of the script
console.log('closing code: ' + code);
console.log('Full output of script: ',scriptOutput);
});
콜백 + 비동기 메서드를 사용하는 방법은 다음과 같습니다 .
var child_process = require('child_process');
console.log("Node Version: ", process.version);
run_script("ls", ["-l", "/home"], function(output, exit_code) {
console.log("Process Finished.");
console.log('closing code: ' + exit_code);
console.log('Full output of script: ',output);
});
console.log ("Continuing to do node things while the process runs at the same time...");
// This function will output the lines from the script
// AS is runs, AND will return the full combined output
// as well as exit code when it's done (using the callback).
function run_script(command, args, callback) {
console.log("Starting Process.");
var child = child_process.spawn(command, args);
var scriptOutput = "";
child.stdout.setEncoding('utf8');
child.stdout.on('data', function(data) {
console.log('stdout: ' + data);
data=data.toString();
scriptOutput+=data;
});
child.stderr.setEncoding('utf8');
child.stderr.on('data', function(data) {
console.log('stderr: ' + data);
data=data.toString();
scriptOutput+=data;
});
child.on('close', function(code) {
callback(scriptOutput,code);
});
}
위의 방법을 사용하면 스크립트의 모든 출력 행을 클라이언트로 보낼 수 있습니다 (예 : stdout
또는에서 이벤트를 수신 할 때 Socket.io를 사용하여 각 행을 전송 stderr
).
동기식
노드가 수행중인 작업을 중지 하고 스크립트가 완료 될 때까지 기다리 려면 동기 버전을 사용할 수 있습니다.
child_process.spawnSync (...); (노드 v0.11.12 이상)
이 방법의 문제 :
- 스크립트를 완료하는 데 시간이 걸리면 해당 시간 동안 서버가 중단됩니다!
- stdout은 스크립트 실행이 완료된 후에 만 반환됩니다 . 동기식이기 때문에 현재 줄이 끝날 때까지 계속할 수 없습니다. 따라서 스폰 라인이 끝날 때까지 'stdout'이벤트를 캡처 할 수 없습니다.
사용 방법:
var child_process = require('child_process');
var child = child_process.spawnSync("ls", ["-l", "/home"], { encoding : 'utf8' });
console.log("Process finished.");
if(child.error) {
console.log("ERROR: ",child.error);
}
console.log("stdout: ",child.stdout);
console.log("stderr: ",child.stderr);
console.log("exist code: ",child.status);
python
를 전달하는 것을 잊지 마십시오-u
. 그렇지 않으면 스크립트가 라이브가 아닌 것처럼 보일 것입니다. stackoverflow.com/a/49947671/906265