É muito mais fácil agora (6 anos depois)!
Spawn retorna um childObject , com o qual você pode escutar eventos . Os eventos são:
- Classe: ChildProcess
- Evento: 'erro'
- Evento: 'saída'
- Evento: 'fechar'
- Evento: 'desconectar'
- Evento: 'mensagem'
Existem também vários objetos de childObject , são eles:
- Classe: ChildProcess
- child.stdin
- child.stdout
- child.stderr
- child.stdio
- child.pid
- child.connected
- child.kill ([sinal])
- child.send (mensagem [, sendHandle] [, callback])
- child.disconnect ()
Veja mais informações aqui sobre childObject: https://nodejs.org/api/child_process.html
Assíncrono
Se você deseja executar seu processo em segundo plano enquanto o nó ainda é capaz de continuar a executar, use o método assíncrono. Você ainda pode optar por executar ações após a conclusão do processo e quando o processo tiver alguma saída (por exemplo, se você quiser enviar a saída de um script para o cliente).
child_process.spawn (...); (Nó 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);
});
Veja como você usaria um retorno de chamada + método assíncrono :
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);
});
}
Usando o método acima, você pode enviar todas as linhas de saída do script para o cliente (por exemplo, usando Socket.io para enviar cada linha quando receber eventos em stdout
ou stderr
).
Síncrono
Se você quiser que o nó pare o que está fazendo e espere até que o script seja concluído , você pode usar a versão síncrona:
child_process.spawnSync (...); (Nó v0.11.12 +)
Problemas com este método:
- Se o script demorar um pouco para ser concluído, seu servidor irá travar por esse tempo!
- O stdout só será retornado quando o script terminar de ser executado . Por ser síncrono, não pode continuar até que a linha atual termine. Portanto, ele é incapaz de capturar o evento 'stdout' até que a linha de spawn termine.
Como usá-lo:
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
, não se esqueça de passar o-u
sinalizador para que ele não faça buffer da saída do console, caso contrário, parecerá que o script não está